生成二叉树

数据结构起始并不没有你想象的那么难 当然如果你能静下心来思考 花点时间在上面的话!!!

根据先序和中序生成二叉树


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;
}

灵感来源:

leetcode题解

posted @ 2022-10-25 23:44  程序员包子  阅读(130)  评论(0编辑  收藏  举报