重组二叉树。。。一时之间没有想到节点怎么会退
解题思路:
前序遍历性质: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序。
中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int size = preorder.size(); if(size == 0) return NULL; stack<TreeNode*>st; int res = 0; TreeNode *root = new TreeNode(preorder[0]); TreeNode *tmp = root; for(int i=1;i<size;i++){ if(tmp->val != inorder[res]){ tmp ->left = new TreeNode(preorder[i]); st.push(tmp); tmp = tmp->left; } else{ res++; while(!st.empty() && st.top()->val == inorder[res]){ res++; tmp = st.top(); st.pop(); } tmp->right = new TreeNode(preorder[i]); tmp = tmp->right; } } return root; } };