• [leetCode]Construct Binary Tree from Preorder and Inorder Traversal


    Given preorder and inorder traversal of a tree, construct the binary tree.

    给了前序和中序遍历,这个题也好做,主要问题是把左右分支的下标给搞清楚。

    对于前序来说,本次的根节点总是第一个preorder[0];左子树坐标是[prestart+1,prestart+i],右子树是[prestart+i+1,preend];

    而对于中序来说,如果根节点是第i个(从instart开始数),那么左边子树的坐标是[instart,instart+i-1],右子树是[instart+i+1,inend];

    如果觉得前序不好算的话,可以先算中序,前序的左子树段是中序左子树段+1(但是要注意初始坐标不一样)

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 struct TreeNode {
     5     int val;
     6     TreeNode  *left;
     7     TreeNode  *right;
     8     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     9 };
    10 class Solution {
    11 public:
    12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    13         TreeNode * head = build(preorder,0,preorder.size()-1,inorder,0, inorder.size()-1);
    14         return head;
    15     }
    16 
    17     TreeNode *build(vector<int> &preorder, int preStart,int preEnd,vector<int> &inorder, int inStart, int inEnd){
    18         if(preStart == preEnd) return new TreeNode(preorder[preStart]);
    19         if(preStart > preEnd)    return NULL;
    20         int head = preorder[preStart];
    21         int i = 0;
    22         int size = preEnd - preStart+1;
    23         for(; i<size;i++){
    24             if(inorder[i+inStart] == head){
    25                 break;
    26             }
    27         }
    28         TreeNode *node = new TreeNode(head);
    29         node->left = build(preorder,preStart+1,preStart+i,inorder, inStart, inStart+i-1);
    30         node->right = build(preorder, preStart+1+i,preEnd,inorder,inStart+1+i,inEnd);
    31         return node;
    32 
    33     }
    34 };
    艰难的成长
  • 相关阅读:
    事务,视图,索引
    SQL 编辑
    相关子查询
    4
    3
    2
    1
    BaseEditor
    EDCheckPrefabRef
    UIUseImgWindow
  • 原文地址:https://www.cnblogs.com/marylins/p/3599406.html
Copyright © 2020-2023  润新知