【问题标题】:Finding minimum height of binary tree with given inorder and level-order traversals使用给定的顺序和级别顺序遍历查找二叉树的最小高度
【发布时间】:2019-11-05 12:19:19
【问题描述】:

二叉树的中序和水平序遍历以及节点总数在函数定义中给出,我们必须计算给定输入的二叉树的最小高度。

我们可以在不构造树的情况下进行计算吗?

func(int[] inorder, int[] levelorder, int n)
{
  // write code here
}

例如

  • 中序遍历 - { 4,2,5,1,6,3,7},
  • levelorder 遍历 - {1,2,3,4,5,6,7}, n=7.

预期的 o/p 是 3

【问题讨论】:

    标签: data-structures binary-tree tree-traversal inorder


    【解决方案1】:

    一个非常简单的方法是构建树然后找到它的高度。

    假设节点的结构是: 结构节点 { 整数键; 结构节点*左,*右; };

    Node* **newNode**(int key)
    {
    Node *node = (Node *)malloc(sizeof(Node));
    node->key = key;
    node->left = node->right = NULL;
    return (node);
    }
    int **getHeight**(Node* root){
        if(root==NULL) return 0;
        return max(getHeight(root->left)+1,getHeight(root->right)+1);
    }
    Node* **getNode**(Node* root,int key){
        if(root!=NULL){
            if(root->key == key) return root;
            return getNode(root->left,key) != NULL ? getNode(root->left,key):
            getNode(root->right,key);
        }
    }
    void **buildTree**(int inorder[], int levelOrder[], int i, int j,int n)
    {
      Node* head = newNode(levelOrder[0]);
      i++;
     int comp = 0;
     while(i<j){
          int key = levelOrder[comp];
          Node* ptr = getNode(head,key);
          int k = n-1;
          while(k>=0 && inorder[k]!=key) k--;
          if(k>0 && inorder[k-1]!=-1){
              ptr->left = newNode(levelOrder[i]);
              i++;
          }
          if(k<n-1 && inorder[k+1]!=-1){
              ptr->right = newNode(levelOrder[i]);
              i++;
          }
       inorder[k] = -1;
       comp++;
    }
    int height = getHeight(head);
      **cout<<height<<" ";**
    }
    

    【讨论】:

    • 代码涉及在两个数组的帮助下构造树,然后计算最小高度,我在测试中已经这样做了。我想在没有树结构的情况下计算高度:/
    • 是的,即使不构建树也可以做到。我也粘贴了该代码。谢谢
    【解决方案2】:
    yes, you can do that without even constructing the tree.
    for that use two queue.
    see given below code for better understanding.
    
    void **buildTree**(int inorder[], int levelOrder[], int i, int j,int n)
    {
        queue<int>q1,q2;
        q1.push(levelOrder[0]);
        int k = 1,height = 0;
        while(!q1.empty() || !q2.empty()){
            if(!q1.empty()) height++;
            while(!q1.empty()){
                int val = q1.front();
                for(int i = 0;i<n;++i){
                    if(inorder[i] == val) break;
                }
                if(i>0 && inorder[i-1] !=-1 && k<n)
                    q2.push(levelOrder[k++]);
                if(i<n-1 && inorder[i+1] !=-1 && k<n) 
                    q2.push(levelOrder[k++]);
                inorder[i] = -1;
                q1.pop();
            }
            if(!q2.empty()) height++;
            while(!q2.empty()){
                int val = q2.front();
                for(int i = 0;i<n;++i){
                    if(inorder[i] == val) break;
                }
                if(i>0 && inorder[i-1] !=-1 && k<n)  
                    q1.push(levelOrder[k++]);
                if(i<n-1 && inorder[i+1] !=-1 && k<n) 
                    q1.push(levelOrder[k++]);
                inorder[i] = -1;
                q2.pop();
            }
        }
     cout<<height<<endl;
    }
    

    【讨论】:

      【解决方案3】:

      二叉树的最小可能高度为log2(n+1),其中n 是节点数。

      【讨论】:

        【解决方案4】:

        下面的代码 sn-p 将在不构造树的情况下计算树的高度。

        #include <iostream>
        #include <queue>
        using namespace std;
        
        int minHeight(int inOrder[], int levelOrder[], int n)
        {
            int i=1;
            queue<int>q1,q2;
            q1.push(levelOrder[0]);
            int k = 1,height = 0;
            while(!q1.empty() || !q2.empty()){
                if(!q1.empty()) height++;
                while(!q1.empty()){
                    int val = q1.front();
                    for(int i = 0;i<n;++i){
                        if(inOrder[i] == val) break;
                    }
                    if(i>0 && inOrder[i-1] !=-1 && k<n)
                        q2.push(levelOrder[k++]);
                    if(i<n-1 && inOrder[i+1] !=-1 && k<n)
                        q2.push(levelOrder[k++]);
                    inOrder[i] = -1;
                    q1.pop();
                }
                if(!q2.empty()) height++;
                while(!q2.empty()){
                    int val = q2.front();
                    for(int i = 0;i<n;++i){
                        if(inOrder[i] == val) break;
                    }
                    if(i>0 && inOrder[i-1] !=-1 && k<n)
                        q1.push(levelOrder[k++]);
                    if(i<n-1 && inOrder[i+1] !=-1 && k<n)
                        q1.push(levelOrder[k++]);
                    inOrder[i] = -1;
                    q2.pop();
                }
            }
         return height;
        }
        
        int main()
        {
            int inOrder[] = {4,2,5,1,6,3,7}; //input1
            int levelOrder[] = {1,2,3,4,5,6,7}; //input2
            int n=sizeof(inOrder)/sizeof(int); ////input3
            cout<<minHeight(inOrder, levelOrder, n)<<endl;
        
            return 0;
        }
        

        【讨论】:

          【解决方案5】:

          问题:如果给定一棵树的中序和层序遍历,那么这棵树的最小高度是多少

          示例 1:

              input1 : {2,1,3}
          
              input2 : {1,2,3}
          
              input3 : 3
          
              Output : 2
          

          示例 2:

               input1 : {4,2,5,2,6,3,7}
          
               input2 : {1,2,3,4,5,6,7}
          
               input3 : 7
          
               Output : 3
          

          如果您在 Naggaro 的 Campus round 或 metti 上遇到这个问题,那么这对您来说将是一个很好的解决方案

          class Node:
              def __init__(self, key):
                  self.data = key
                  self.left = None
                  self.right = None
          
          def buildTree(level, ino):
              if ino:
                  for i in range(0, len(level)):
                      if level[i] in ino: 
                          node = Node(level[i]) 
                          io_index = ino.index(level[i])
                          break
                  if not ino:
                      return node
                  node.left = buildTree(level, ino[0:io_index])
                  node.right = buildTree(level, ino[io_index + 1:len(ino)])
                  return node
            
          def height(root):
              if root is None:
                  return 0 
              else:
                  return max(height(root.left),height(root.right))+1
          
          #This is the function you have to write
          def minHeight(input1,input2,input3):
              global root
              root = buildTree(input1, input2)
              return height(root)
          
          
          inorder = [4,2,5,1,6,3,7]
          levelorder = [1,2,3,4,5,6,7]
          print("height : ",minHeight(levelorder,inorder,len(inorder)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多