树的遍历—数据结构

本周做了一部分关于树的算法,在这里也总结一下遍历数的四种方法。

1.先序遍历 (先根,再左,后右)

2.中序遍历 (先左,再根,后右)

3.后序遍历 (先左,再右,后根)

4.层序遍历 (从每层的左边开始遍历,我自己没有用过)

一、来一道题。在这里插入图片描述

1.先序结果:FCADBEHGM

2.中序结果:ACBDFHEMG

3.后序结果:ABDCHMGEF

4.层序结果:FCEADHGBM

二、递归实现

public static void Tree(TreeNode root){
    
    
//先写出递归的结束条件
	if(root == null){
    
    
	return;
	}
	//先序
	System.out.println(root.val); //先根
	Tree(root.left);	//再左
	Tree(root.right);	//后右
	
	//中序
	Tree(root.left);	//先左
	System.out.println(root.val); //再根
	Tree(root.right);	//后右
	
	//后序
	Tree(root.left);	//先左
	Tree(root.right);	//再右
	System.out.println(root.val); //后根
}

算法中这样实现简单,但是理解比较困难。。

三、非递归实现

本人小菜鸡,下面的理解也是查出来的。

1、先序:首先把根节点压入栈中,此时根节点作为栈顶元素弹出访问。将当前节点的右子树和左子树分别入栈,考虑栈是先入后出因此必须先右子树先入栈,左子树后入栈。重复上述步骤直到栈为空。

2、中序:中序遍历的非递归版本比前序稍微复杂一点,除了用到辅助栈之外,还需要一个指针 p 指向下一个待访问的节点。如果 p 非空,则将 p 入栈,p 指向 p 的左子树。如果 p 为空,说明此时左子树已经访问到尽头了,弹出当前栈顶元素,进行访问,并把 p 设置成 p 的右子树的左子树,即下一个待访问的节点。

3、后序:采用一个辅助栈和两个指针 p 和 r,p 代表下一个需要访问的节点,r 代表上一次需要访问的节点。如果 p 非空,则将 p 入栈,p 指向 p 的左子树。如果 p 为空,代表左子树到了尽头,此时判断栈顶元素,如果栈顶元素存在右子树且没有被访问过 (等于 r 代表被访问过),则右子树入栈,p 指向右子树的左子树,如果栈顶元素不存在或者已经被访问过,则弹出栈顶元素,访问,然后 p 置为 null,r 记录上一次访问的节点 p。

猜你喜欢

转载自blog.csdn.net/weixin_49173037/article/details/121456209