Tree Specail I
题目描述:
关于树的题目非常丰富,也具有一定的挑战性。所以在这边做一下小小的总结。主要是利用题目在总结一些在树题目中常见的思路和方法。
首先是给定一棵的头节点,判断这棵树是不是平衡二叉树。关于平衡二叉树,我们需要的主要是关于树的高度,任意节点的左右节点的深度差值不超过2,这样的二叉树我们称为平衡二叉树。
解题思路:
因为各个节点的左右子树都需要判断,所以我们利用递归的思想来解答这道题。通过递归函数判断左右子树深度决定返回当前节点是否是有效的平衡二叉树节点,然后不断递归到上一层即可判断根节点的平衡。
代码如下:
|
|
题目描述2:
给定一棵树的头结点,找到树中从头节点到叶节点的路径最短的长度。
解题思路:
同上一题类似也是利用递归的方法来找到树的深度。但是这个题目中需要注意的地方是,题目要求的是找到从根节点到叶节点的路径最短,所以我们需要特别判断左子树或者右子树为空的情况;并且路径的最终节点必须是叶节点。
代码如下:
|
|
题目描述3:
另外一种在树中常见的题目是:我们需要根据树的先序遍历、中序遍历和后序遍历重构二叉树。就以用先序遍历和中序遍历来重构二叉树为例。假设一棵树的先序遍历是[1,2,4,5,3,6,7],中序遍历是[4,2,5,1,6,3,7],要求根据这个结果重建二叉树。
解题思路:
我们根据先序遍历和中序遍历的定义可以判断根节点是1,并且左节点的集合是[4,2,5],右节点的集合是[6,3,7]。根据左节点集合的长度我们可以知道对于的先序遍历的集合分别为[2,4,5]和[3,6,7]。这样我们就可以递归的分别根据[4,2,5]和[2,4,5]建立左子树;根据[6,3,7]和[3,6,7]来建立右子树。
代码如下:
|
|
类似的根据中序遍历和后序遍历来构建二叉树的代码如下:
|
|