最近遇到的两道二叉树的比较有意思的题

感觉好久没写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},则重建二叉树并返回。
这一道题目是有扩展的。我想把他的扩展题目研究一下,再总结到博客中

题目如下:给出一个树的前序遍历,输出这个树所有可能的中序遍历


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值