剑指Offer对答如流系列 - 二叉树的下一个节点

面试题7:二叉树的下一个节点

一、题目描述:

给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别别指向左右子节点的指针,还有一个指向父节点的指针

在这里插入图片描述

例如:这棵树的中序遍历是:D,B,H,E,I,A,F,C,G

二、解题思路:

这套题相比于上一道面试题剑指Offer对答如流系列 - 重建二叉树而言,换汤不换药,还是考察你对二叉树结构的理解。

以这棵树为例:
在这里插入图片描述
二叉树的基本结构

	//中序以node为根的
	public void inOrder(Node node) {
		//终止条件
		if(node == null) {
			return;
		}
		inOrder(node.left);
		System.out.println(node.e);
		inOrder(node.right);
	}

中序遍历:左子树—> 根结点 —> 右子树(在中间遍历根节点)

	//中序以node为根的
	public void inOrder(Node node) {
		//终止条件
		if(node == null) {
			return;
		}
		inOrder(node.left);
		System.out.println(node.e);
		inOrder(node.right);
	}

这棵树的中序遍历为:ACBDFHEMG

既然要求我们找出二叉树的下一个节点,我们就要好好分析中序遍历可能出现的情况,让我们好好捋一下:

以任意一个节点为切入点:
如果我们分析左子树,根据中序遍历的顺序(左子树—> 根结点 —> 右子树)不会得到我们想要的结果。我们只能从右子树进行分析,下面和我一起动笔画画(很重要),找找下一个节点的寻找有哪些场景。

(1)当节点的右子树不为空:节点的下一个节点就是这个节点的右子树中的最左子节点,也就是从右子节点出发一直沿着指向左子节点的指针,走到最后一个叶子节点就是此节点的下一个子节点。在这里插入图片描述
(2)当节点的右子树为空,并且是它父节点的右子树:沿着指向父节点的指针向上遍历,直到找到一个是它父节点的左子节点的节点,那么这个节点的父节点就是我们要找的下一个节点
在这里插入图片描述

(3)当结点的右子树为空,且是它父节点的左子节点时,它的下一个节点就是它的父节点
在这里插入图片描述

没有别的情况了吧,下面就去实现吧,不要妄想一步到位,第一次写肯定有bug,而且中间穿插着你大量的思考,除非你对二叉树非常非常熟悉了。

书中提供的是C++的树结构,这里我提供Java的

   class Node {
        int val;
        Node left = null;
        Node right = null;
        Node parent = null;

        Node(int val) {
            this.val = val;
        }
    }

解答:

   public Node GetNext(Node pNode) {
        if (pNode == null) {
            return null;
        }
        if (pNode.right != null) {
            pNode = pNode.right;
            while(pNode.left!=null)
                pNode=pNode.left;
            return pNode;
        }
        while(pNode.parent !=null){
            if(pNode==pNode.parent.left)
                return pNode.parent;
            pNode=pNode.parent;
        }
        return null;
    }

📚 快来,快来。打开CSDN APP扫一下下面二维码或者点击 传送门 ,加入我的大本营(免费的),向我和其他人气博主提问哈。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值