您的位置:首页 > 编程语言 > C语言/C++

根据树的前序遍历与中序遍历构建二叉树

2017-03-15 14:18 141 查看

根据树的前序遍历与中序遍历构建二叉树

平台:VS2013

二叉树可以根据其前序遍历及中序遍历唯一确定一棵二叉树,对于前序遍历来说,第一个数字便为树的根,而对于中序遍历来说,找到根节点后,根节点之前的所有数均为左子树,之后的全为右子数,根据这一特点来递归构建二叉树,该示例为此树中没有相同的数字。代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct TreeNode{
int data;
TreeNode* leftChild=NULL;
TreeNode* rightChild=NULL;
};

TreeNode* buildTree(vector<int> vPreOrder, vector<int> vInOrder){
TreeNode* tRoot;
if (vPreOrder.empty()) return NULL;
tRoot = new TreeNode;
auto rootId = find(vInOrder.begin(), vInOrder.end(), vPreOrder.at(0));
vector<int> leftInChild;
vector<int> rightInChild;
for (auto it = vInOrder.cbegin(); it != rootId; ++it) leftInChild.push_back(*it);
for (auto it = rootId + 1; it != vInOrder.cend(); ++it) rightInChild.push_back(*it);
int leftChildLength = leftInChild.size();
int rightChildLength = rightInChild.size();
vector<int> leftPreChild;
vector<int> rightPreChild;
for (int i = 1; i < leftChildLength + 1; ++i)leftPreChild.push_back(vPreOrder.at(i));
for (int i = 1; i < rightChildLength + 1; ++i)rightPreChild.push_back(vPreOrder.at(i + leftChildLength));

tRoot->data = vPreOrder.at(0);
tRoot->leftChild = buildTree(leftPreChild, leftInChild);
tRoot->rightChild = buildTree(rightPreChild, rightInChild);
return tRoot;
}

void    prePrint(TreeNode* head){
if (head){
cout << head->data;
prePrint(head->leftChild);
prePrint(head->rightChild);
}
}

int main(void){
vector<int>  vPreOrder{ 1, 2, 4, 7, 3, 5, 6, 8 };
vector<int> vInOrder{ 4, 7, 2, 1, 5, 3, 8, 6 };
TreeNode* tRoot=buildTree(vPreOrder,vInOrder);
prePrint(tRoot);
cout << endl;
return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐