标签:treenode order length 通过 ret ons div off 中序遍历
/* 题目: 输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。 */ /* 思路: 使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。 采用递归的方法建立。 */ struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right } BinaryTreeNode* Construct(int* preOrder,int* Inorder,int length){ if(preOrder == null || Inorder == null || length <= 0){ return null; } return ConstructCore(preOrder,preOrder+length-1,Inorder,Inorder+length-1); } BinaryTreeNode* ConstructCore(int *preOrder,int* endPreOrder,int* inOrder,int *endInOrder){ BinaryTreeNode* root = new BinaryTreeNode(); root->value = *preOrder; root->left = null; root->right = null; if(preOrder == endInOrder){ if(inOrder == endInOrder && preOrder == inOrder){ return root; } else{ throw std::exception("Invalid input"); } } //在中序遍历中找到根节点 int* rootInorder = inOrder; while(rootInorder <= endInOrder && *rootInorder != root->value){ rootInorder++; } int leftLength = rootInorder - inOrder; int *leftPreOrderEnd = preOrder + leftLength; //创建左子树 if(leftLength > 0){ root->left = ConstructCore(preOrder+1,leftPreOrderEnd,inOrder,rootInorder-1); } if(leftLength < endPreOrder - preOrder){ root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInorder+1,endInOrder); } return root; }
标签:treenode order length 通过 ret ons div off 中序遍历
原文地址:https://www.cnblogs.com/buaaZhhx/p/11809036.html