您的位置:首页 > 其它

106. Construct Binary Tree from Inorder and Postorder Traversal

2016-09-04 07:14 337 查看
Given inorder and postorder traversal of a tree, construct the binary tree.

Note: You may assume that duplicates do not exist in the tree.

这题跟105. construct binary tree from preorder and inorder traversal几乎是一回事。所以就不再分析,自己手动从输出到树回复一边,找到两种输出之间的位置关系就行。这里就直接给出递归和迭代两种方法,代码跟105题如出一辙。

方法一:递归

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return helper(postorder, inorder, 0, inorder.size()-1, 0, postorder.size()-1);
}
TreeNode* helper(vector<int>& postorder, vector<int>& inorder, int instart, int inend, int postart, int poend) {
if (instart > inend) return NULL;
int rootval = postorder[poend];
int i;
for (i = instart; i <= inend; i++) {
if (inorder[i] == rootval) break;
}
TreeNode* res = new TreeNode(rootval);
res->left = helper(postorder, inorder, instart, i-1, postart, postart+(i-instart)-1);
res->right = helper(postorder, inorder, i+1, inend, postart+(i-instart), poend-1);
return res;
}


方法二:queue里的迭代

private:
struct NewNode {
TreeNode* node;
int rootindex;
int leftindex;
int rightindex;
NewNode(TreeNode* treenode): node(treenode), rootindex(0), leftindex(0), rightindex(0) {}
};
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (postorder.size() == 0 || inorder.size() == 0) return NULL;
queue<NewNode*> queueNode;
TreeNode *root = new TreeNode(postorder[postorder.size()-1]);
NewNode *Root = new NewNode(root);
Root->rootindex = postorder.size() - 1;
Root->rightindex = inorder.size() - 1;
queueNode.push(Root);
int rootval;
while (!queueNode.empty()) {
NewNode* curNode = queueNode.front();
queueNode.pop();
if (curNode->leftindex >= curNode->rightindex) continue;
rootval = postorder[curNode->rootindex];
for (int i = curNode->leftindex; i <= curNode->rightindex; i++) {
if (inorder[i] == rootval) {
if (i < curNode->rightindex) {
TreeNode* rightnode = new TreeNode(postorder[curNode->rootindex-1]);
NewNode* rightNode = new NewNode(rightnode);
rightNode->rootindex = curNode->rootindex - 1;
rightNode->leftindex = i + 1;
rightNode->rightindex = curNode->rightindex;
curNode->node->right = rightnode;
queueNode.push(rightNode);
}
if (i > curNode->leftindex) {
TreeNode* leftnode = new TreeNode(postorder[curNode->rootindex-(curNode->rightindex-i)-1]);
NewNode* leftNode = new NewNode(leftnode);
leftNode->rootindex = curNode->rootindex-(curNode->rightindex-i)-1;
leftNode->leftindex = curNode->leftindex;
leftNode->rightindex = i - 1;
curNode->node->left = leftnode;
queueNode.push(leftNode);
}
}
}
}
return root;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐