• LeetCode(105):从前序与中序遍历序列构造二叉树


    Medium!

    题目描述:

    根据一棵树的前序遍历与中序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7

    解题思路:

    这道题要求用先序和中序遍历来建立二叉树,由于先序的顺序的第一个肯定是根,所以原二叉树的根节点可以知道,题目中给了一个很关键的条件就是树中没有相同元素,有了这个条件我们就可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。

    C++解法一:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    13         return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    14     }
    15     TreeNode *buildTree(vector<int> &preorder, int pLeft, int pRight, vector<int> &inorder, int iLeft, int iRight) {
    16         if (pLeft > pRight || iLeft > iRight) return NULL;
    17         int i = 0;
    18         for (i = iLeft; i <= iRight; ++i) {
    19             if (preorder[pLeft] == inorder[i]) break;
    20         }
    21         TreeNode *cur = new TreeNode(preorder[pLeft]);
    22         cur->left = buildTree(preorder, pLeft + 1, pLeft + i - iLeft, inorder, iLeft, i - 1);
    23         cur->right = buildTree(preorder, pLeft + i - iLeft + 1, pRight, inorder, i + 1, iRight);
    24         return cur;
    25     }
    26 };

    我们下面来看一个例子, 某一二叉树的中序和后序遍历分别为:

    Preorder:    5  4  11  8  13  9

    Inorder:    11  4  5  13  8  9

    5  4  11  8  13  9      =>          5

    11  4  5  13  8  9                /  

    4  11     8   13  9      =>         5

    11  4     13  8  9                  /  

                                 4   8

    11       13    9        =>         5

    11       13    9                    /  

                                 4   8

                                /    /    

                               11    13    9

    做完这道题后,大多人可能会有个疑问,怎么没有由先序和后序遍历建立二叉树呢,这是因为先序和后序遍历不能唯一的确定一个二叉树,比如下面五棵树:

        1      preorder:    1  2  3
       /        inorder:       2  1  3
     2    3       postorder:   2  3  1

           1       preorder:     1  2  3
          /       inorder:       3  2  1
        2          postorder:   3  2  1
       /
     3

           1        preorder:    1  2  3
          /        inorder:      2  3  1
        2       postorder:  3  2  1
         
           3

           1         preorder:    1  2  3
                     inorder:      1  3  2
              2      postorder:  3  2  1
             /
           3

           1         preorder:    1  2  3
                   inorder:      1  2  3
              2      postorder:  3  2  1
               
        3

     从上面我们可以看出,对于先序遍历都为1 2 3的五棵二叉树,它们的中序遍历都不相同,而它们的后序遍历却有相同的,所以只有和中序遍历一起才能唯一的确定一棵二叉树。

  • 相关阅读:
    捡到一本<C++ Reference>
    题目1008:最短路径问题
    题目1014:排名
    题目1080:进制转换
    题目1081:递推数列
    题目1086:最小花费
    题目1076:N的阶乘
    题目1035:找出直系亲属
    在Mac上搭建Jenkins环境
    获取鼠标点击UGUI,先对于特定物体的相对坐标
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9162431.html
Copyright © 2020-2023  润新知