感觉好久没写blog了,好吧,最近在学习spring框架。感觉这玩意需要配置的环境太多,前面学习的东西差不多忘干净了。早点发现这一问题,并开始总结,可能就是最好的补救措施吧,遗忘总会有的,经常总结,经常回头看一看就好了。常用常思考。
所以,今天来总结一下最近遇到的两道比较有意思的二叉树相关的题。
problem1:(个人感觉很经典)
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
二叉树的结构如下
/*public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode parent = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
先说一下自己的思路。其实我发现做算法题,大部分情况是有思路,但是不知道用代码如何去实现,这时候欠缺的是将思路转化为代码的能力,也就是常说的编程能力。好吧,我承认我的编程能力奇差。所以自己也在好好搭积木块。不吐槽了,中序遍历的过程,这个不了解的,请打开百度,搜索二叉树的中序遍历方式,好了,接下来,举个栗子。
首先,图中二叉树中序遍历的结果是{D,N,H,B,I,E,J,A,F,K,C,L,G,M}嗯,再次检查,没有错误。
这样我们可以分析一下,几种得到下一个节点的特殊形式。
1.如果一个节点有右子树,那么他的下一个节点是右子树中的最左边的节点(即右子树中左子树中的节点)
2.如果一个节点无右子树,且是其父节点的左子树,那么他的下一个节点就是其父节点
3.如果一个节点是其父节点的右子树中的最右边的节点,那么需要根据指向父节点的指针找到整棵树的根节点,若根节点存在右子树,则继续寻找下一个节点
public TreeLinkNode GetNext(TreeLinkNode pNode) {
// 根据中序遍历的方式的特性(左中右)
//给定树中的任意一个节点,首先应该考虑的是这个节点是否存在右子树。
if(pNode==null) return pNode;
TreeLinkNode parent=null;
if(pNode.right!=null)
{
//找到右子树中最左边的节点
return GetLeftNext(pNode);
}else {
//该节点不存在右节点时,他的下一个节点要么是其父节点,要么是二叉树的根节点。这时候就需要判断了
parent=pNode.parent;
}
//当该节点是其父节点的左孩子时,该节点的下一个节点就是其父节点,否则,其下一个节点就是树的根节点
while(parent!=null && pNode!=parent.left)
{
//根据parent指针,向上寻找,直到找到二叉树的根节点。
pNode=parent;
parent=pNode.parent;
}
return parent;
}
public static TreeLinkNode GetLeftNext(TreeLinkNode pNode)
{
if(pNode==null) return pNode;
while(pNode.left!=null)
{
pNode=pNode.left;
}
return pNode;
}
附上另外一道的题目,题解另外开一篇文章吧。
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
这一道题目是有扩展的。我想把他的扩展题目研究一下,再总结到博客中
题目如下:给出一个树的前序遍历,输出这个树所有可能的中序遍历