Given the pre-order and in-order traversing result of a binary tree, write a function to rebuild the tree ideas?
e*c
2 楼
打算自己卖房子,zillow上面的价格也不靠谱呀,请过来人指点一下
d*2
3 楼
find root from pre-order tree, use that to split left-tree, right-tree from in-order list, recursively go down.
I*A
4 楼
don't understand how to do this recursively.. //羞愧
from
【在 d****2 的大作中提到】 : find root from pre-order tree, use that to split left-tree, right-tree from : in-order list, recursively go down.
d*2
5 楼
preorder: 1 2 3 4 5 inorder: 3 2 4 1 5 root 1 left subtree preorder 2 3 4 left subtree inorder 3 2 4 right subtree preorder 5 right subtree inorder 5 recursively work on left subtree and right subtree with the known preorder and inorder lists.
I*A
6 楼
thanks a lot.. i can manually construct it, but 写不出来 this recursive code. :( 能否写个code看看?
【在 d****2 的大作中提到】 : preorder: 1 2 3 4 5 : inorder: 3 2 4 1 5 : root 1 : left subtree preorder 2 3 4 : left subtree inorder 3 2 4 : right subtree preorder 5 : right subtree inorder 5 : recursively work on left subtree and right subtree with the known : preorder and inorder lists.
d*2
7 楼
struct tree_node { int x; tree_node *left; tree_node *right; }; tree_node *build_tree(const std::vector &preorder, int start1, int end1 , const std::vector &inorder, int start2, int end2) { if (start1 > end1) return NULL; if (start1 == end1) { tree_node *tn = new tree_node; tn->x = preorder[start1]; tn->left = NULL; tn->right = NULL; return tn; } int pos; for (pos = start2; pos <= end2; pos++) if (inorder[pos] == preorder[start1])
I*A
8 楼
thanks so much first~ 等我仔细看
end1
【在 d****2 的大作中提到】 : struct tree_node { : int x; : tree_node *left; : tree_node *right; : }; : tree_node *build_tree(const std::vector &preorder, int start1, int end1 : , const std::vector &inorder, int start2, int end2) { : if (start1 > end1) : return NULL; : if (start1 == end1) {
j*l
9 楼
写个简洁的从前序和中序序列重建二叉树的代码,以飨版友。 TreeNode* rebuild(char *pstr, char *istr, int n) { if (n <= 0) return NULL; TreeNode* root = new TreeNode; root->data = *pstr; char* iter; for (iter = istr; iter < istr + n; iter++) { if (*iter == *pstr) break; } int k = iter - istr; root->left = rebuild(pstr + 1, istr, k); root->right = rebuild(pstr + k + 1, iter + 1, n - k - 1); return root; }
j*l
10 楼
这个是一年前Amazon问我的电面题。
a
【在 I**A 的大作中提到】 : Given the pre-order and in-order traversing result of a binary tree, write a : function to rebuild the tree : ideas?
l*g
11 楼
这个也太常规了吧。choose root from pre-order, all the left nodes are listed on the left in the in-order traverse, vice versa.
a
【在 I**A 的大作中提到】 : Given the pre-order and in-order traversing result of a binary tree, write a : function to rebuild the tree : ideas?
d*e
12 楼
果然简洁。 发觉自己真的弱,写了一个多小时才写出无bug能正确运行的code....要多做题才行。
【在 j**l 的大作中提到】 : 写个简洁的从前序和中序序列重建二叉树的代码,以飨版友。 : TreeNode* rebuild(char *pstr, char *istr, int n) : { : if (n <= 0) : return NULL; : TreeNode* root = new TreeNode; : root->data = *pstr; : char* iter; : for (iter = istr; iter < istr + n; iter++) : {
I*A
13 楼
这个和地主那个,各有利弊,地主那个很好理解。。 这个有没有bug?我写了个java version,对某些树,不work, 帮着看看,哪儿的问题? public static Node buildTree(int[] preorder, int start1, int[] inorder, int start2, int len){ if(len<=0) return null;
Node node = new Node(preorder[start1]);
int k; for(k=start2; kif(inorder[k] == preorder[start1]) break;
if(k==start2+len) return null;
node
【在 j**l 的大作中提到】 : 写个简洁的从前序和中序序列重建二叉树的代码,以飨版友。 : TreeNode* rebuild(char *pstr, char *istr, int n) : { : if (n <= 0) : return NULL; : TreeNode* root = new TreeNode; : root->data = *pstr; : char* iter; : for (iter = istr; iter < istr + n; iter++) : {
d*2
14 楼
题? , len-k-1
【在 I**A 的大作中提到】 : 这个和地主那个,各有利弊,地主那个很好理解。。 : 这个有没有bug?我写了个java version,对某些树,不work, 帮着看看,哪儿的问题? : public static Node buildTree(int[] preorder, int start1, int[] inorder, : int start2, int len){ : if(len<=0) : return null; : : Node node = new Node(preorder[start1]); : : int k;