二叉树的遍历方式

写在前面

  • 本意是仅用作个人笔记,如果有人看,哪有问题也可以说。

假定的二叉树结构

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
};

先序遍历

先序遍历的顺序是,根结点->左子树->右子树。

void main(struct TreeNode *tree)
{
	//对于给定的根节点
	//先序遍历的操作就是,打印数据,然后再递归调用左子树、右子树
	//当然有个前提是,根节点不为空
	if(tree)
	{
		printf("%d",tree->val);
		main(tree->left);
		main(tree->right);
	}
}

中序遍历

中序遍历的顺序是,左子树->根结点->右子树。

void main(struct TreeNode *tree)
{
	//对于给定的根节点
	//中序遍历的操作就是,递归调用左子树,打印数据,递归调用右子树
	//当然前提依然是,根节点不为空
	if(tree)
	{
		main(tree->left);
		printf("%d",tree->val);
		main(tree->right);
	}
	//当左子树调用完了,再打印数据,自然就是中序遍历的顺序。
	//而对于最左下角的叶结点而言,他没得调用左子树,便只能直接打印数据,也正好符合逻辑
}

后序遍历

后序遍历的顺序是,左子树->右子树->根结点。

void main(struct TreeNode *tree)
{
	//对于给定的根节点
	//后序遍历的操作就是,递归调用左子树、右子树,然后打印数据。
	//当然前提还是,根节点不为空
	if(tree)
	{
		printf("%d",tree->val);
		main(tree->left);
		main(tree->right);
	}
}

层序遍历

  • 层序遍历较特殊,需要用到队列,如果忘了内容了,那就先回去复习一下。
  • 层序遍历的顺序是,从上到下,从左到右,所以用到了队列。
    操作是,初始化队列,循环输出队头元素,然后先后将左、右子树放进队列。
    直至输出完了,队列为空了就结束。

具体代码就是

void main(struct TreeNode *tree)
{
Queue Q;	//指向队列的指针变量Q
struct TreeNode* T;
if(!tree) return;	//若是空树则直接返回
Q = CreatQueue(MaxSize);	创建并初始化队列Q
AddQ(Q,tree);	//将根节点tree放进队列Q
while(!IsEmpty)	//当队列不是空队列时
{
T = DeleteQ(Q);	//删除并返回队头元素
printf("%d",T->val);
if(T->left) AddQ(Q,T->left);
if(T->right) AddQ(Q,T->right);
}
}

posted @ 2023-01-25 22:03  淦丘比  阅读(15)  评论(0编辑  收藏  举报