算法数据结构(二叉树)

本文探讨了二叉树的各种遍历方法,包括先序、中序、后序及递归序,并通过实例分析了它们的特点。文章还介绍了如何使用非递归方式实现这些遍历。此外,讲解了二叉树的层次遍历、序列化与反序列化,以及多叉树编码成二叉树的方法。同时,涉及了二叉树的特定问题,如最宽层节点数、后继节点查找、完全二叉树判断等,通过递归套路解析了解决策略。最后,讨论了如何判断二叉树是否平衡、搜索二叉树以及计算最大距离等。
摘要由CSDN通过智能技术生成

 

 先序:

 中序:

后序:

 递归序:

 

 递归序中,每一个会有三次来到。、

先序:第一次来到打印,其他不管

 就是图中1,2,3三个位置,三次回到自己

二、练习题

1、X在先序遍历中左边的集合与X在先序遍历中右边的集合取交集,是X的祖先节点

原因:

①先序遍历中,X所有祖先节点都在X左边,

后序遍历中,X所有祖先节点在X右边

②X所有的孩子节点,都不在交集内

 ③下图的情况一个在左一个在又

 2、用非递归的方式实现二叉树的先序,中序,后序

先序遍历:

 

头右左:

 中序:

 3、实现二叉树的按层遍历

4、二叉树的序列化与反序列化

先序方式序列化:

 先序方式反序列化:

 中序方式不能序列化。

 

 按层方式遍历序列化

 

 按层方式遍历反序列化

4、将多叉树编码成二叉树

 

 5、求二叉树中最宽的层有多少个节点

在宽度优先遍历的基础上,增加几个变量,标指每一层个数(增加nextend提前记录下一个变量,这种方法很常用)

 这个题也可以用表来做:见代码

6、给你二叉树的某个节点,返回后继节点

 后继节点:在中序遍历中,一个节点的下一个节点

方法一:根据给定节点的parent指针,找到二叉树的head节点,进行中序排序

缺点:时间复杂度O(n)

方法二:既然给了parent指针,想想从结构上找到后继节点

①X有右树,X的后继节点是X右树上的最左孩子

②X不断往上找,找到一个节点是父亲的左孩子,这个节点的父节点就是X的后继(X找是哪一个节点左树上的最右)

③都是左孩子,往上走一步,父节点就是后继节点

public static class Node {
		public int value;
		public Node left;
		public Node right;
		public Node parent;

		public Node(int data) {
			this.value = data;
		}
	}

	public static Node getSuccessorNode(Node node) {
		if (node == null) {
			return node;
		}
		if (node.right != null) {
			return getLeftMost(node.right);
		} else { // 无右子树
			Node parent = node.parent;
			while (parent != null && parent.right == node) { // 当前节点是其父亲节点右孩子
				node = parent;
				parent = node.parent;
			}
			return parent;
		}
	}

	public static Node getLeftMost(Node node) {
		if (node == null) {
			return node;
		}
		while (node.left != null) {
			node = node.left;
		}
		return node;
	}

7、将一张纸对着N次

从上往下打印这张二叉树折痕的方向,中序遍历。

 这颗二叉树的规律:

①头结点是凹折痕

②所有左子树的头都是凹

③所有右子数的头都是凸的

8、判断二叉树是否是完全二叉树

按层遍历,

①有右无左false,

②当第一次遇到左右孩子不双全时,剩下遍历的节点,必须是叶

四、二叉树的递归套路

1、

背景:平衡二叉树,在每一颗子树里,左树的最大高度与右树的最大高度相差不超过1(每一个子树都要满足)

要想二叉树是平衡二叉树,要满足:

①X左子树 平衡二叉树

②X右子数 平衡二叉树

③X左高-X右高<2

递归,向你的左树要求什么 ,右树要求什么,自己就要满足什么

 

 

 

 2、如何判断一个二叉树是搜索二叉树

搜索二叉树:每一个子树头结点,左树都比头小,右树都比头大

方法一:中序遍历来做

方法二:就想以X为头的数,他怎么才能数搜索二叉树

列可能性,可以像左树要某些信息,右树要某些信息了,搜索整合信息返回

 

 所以求全值。

3、

 距离:任何两个节点之间,用最精简的走法走到,中间节点的数量

使用递归套路:

目标:求X为头的情况下整棵树的最大距离

列可能性:距离与X无关①X左树的最大距离②X右树的最大距离

距离与X有关③X左树与X最远(左树高度)+X右树与X最远(右树高度)+1

对左右树提的要求:最大距离,高度

最终结果就是三种可能性中求max

 4、判断一棵树是否是满二叉树。

满二叉树,二叉树的高度是h,那么满二叉树的节点数是2^h-1

以X为头结点,需要收集h以及n节点数

 5、整颗二叉树中,有哪些子树是搜索二叉树,找出整颗数上搜索二叉树中节点最多的子树,返回节点数

目标:X节点为头的情况下,最大满足搜索二叉树的子树有多大

列可能性:X不做头:①左边max②右边max

X作头①左 Bst?②右 Bst? ③左树的最大值小于X④ 右min>X⑤左size,右size+1

二叉树递归套路总结:

 左边得到三个信息,右边得到三个信息,整合好三个信息往上。树形DP

不管什么题都想以X为头,目标怎么实现,列可能性是最重要的,左树要来简单信息,右树要来简单信息,能加工出来信息。

常见分类:目标有X,目标无X

为NULL好设置就设置,不好设置就上层处理

 

 6、判断二叉树是否完全二叉树

目标:以X节点为头的二叉树,是否满足完全二叉树

可能性:

要什么信息: 树满不满,高度,完全二叉树

 7、自己练

 8、

 

 最低公共祖先即第一次相交的点

方法一:递归遍历二叉树,用map来记录每个节点的父节点。把a向上跳的头结点加入到set中去,b向上找的过程中如果出现了头结点在a中有就是这个节点。

方法二:二叉树递归的套路

目标:X这颗树上,a,b最初汇聚在哪?

列可能性:汇聚点和X无关 ①左树上有答案②右树上有答案③X的整颗树上a,b不全

汇聚点和X有关①X作为答案,左树发现一个,右树发现另一个,在x这里最终汇聚

②X本身就是a节点,左树或者右树发现了b

信息:是否发现a 是否发现b 是否有ab汇聚的最低公共祖先

9、

目标:以X为头的整颗树,获得的最大值happy是多少

列可能性:①X来时整棵树最大值②X不来时整棵树最大值

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值