首页 > 其他 > 详细

[leetCode]Construct Binary Tree from Preorder and Inorder Traversal

时间:2014-03-14 18:13:00      阅读:317      评论:0      收藏:0      [点我收藏+]

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(但是要注意初始坐标不一样)

bubuko.com,布布扣
 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 };
bubuko.com,布布扣

[leetCode]Construct Binary Tree from Preorder and Inorder Traversal,布布扣,bubuko.com

[leetCode]Construct Binary Tree from Preorder and Inorder Traversal

原文:http://www.cnblogs.com/marylins/p/3599406.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!