生成二叉树
数据结构起始并不没有你想象的那么难 当然如果你能静下心来思考 花点时间在上面的话!!!
根据先序和中序生成二叉树
1.递归法
递归的思路就是分冶,将每一部分配给压栈完成。
先序序列:A B E C D F G H I J
中序序列:E B C D A F H I G J
生成二叉树思路:
1.先序的第一个节点一定是根节点
2.找到中序中的位置来划分左右子树
第一次:
ROOT:A
在中序中的位置可以通过遍历找到 positon
那么左半边的子树应该为
preOrder:BECD
midOrder:EBCD
又半边的子树
preOrder:F G H I J
midOrder:F H I G J
代码细节:
TreeNode* createTree(TreeNode* root, int* preOrder, int* midOrder, int size) {
if (size == 0) {
return nullptr;
}
//根据先序和中序创建二叉树
root = (TreeNode*)malloc(sizeof(TreeNode));
root->Data = preOrder[0];
root->Left = nullptr;
root->Right = nullptr;
//根据先序遍历划分中序 找到position位置
int p = 0;
while (p < size) {
if (preOrder[0] == midOrder[p]) {
break;
}
p++;
}
//中序左部分和右部分
int leftSize = p;
int rightSize = size - p - 1;
//此时第一次传入的应为 BECD 传入preOrder+1,是因为preorder+1包含了这个区间,并且传入的leftSize可以约束这个区间
root->Left = createTree(root->Left, preOrder + 1, midOrder, leftSize);
//传入右子树正常
root->Right = createTree(root->Right, preOrder + leftSize + 1, midOrder + leftSize + 1, rightSize);
return root;
}
灵感来源:
作者:程序员包子,转载请注明原文链接:https://www.cnblogs.com/coder-baozi/articles/16826842.html
coder-baozi一位菜鸟码农