剑指offer之二叉树的下一个结点(中序遍历)

本文介绍了一种算法,用于确定给定二叉树中任一节点进行中序遍历时的下一个节点。主要讨论了有无右子树的不同情况,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中序遍历

1、中序遍历根节点的左子树;

2、访问根节点;

3、中序遍历根节点的右子树;

中序遍历结果:dbheiafcg

问题描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路及代码

三种情况:

1、该结点有右子树,则下一结点为右子树中序遍历的最左节点;

2、该结点无左子树&&父节点不为空{

caseA:该节点为父节点的左节点,则下一节点为父节点;

caseB:该结点为父节点的右节点,则向上遍历至当前结点为父节点的左节点(非右节点),则当前结点的父节点为下一节点;

或一直向上遍历到当前结点无父节点,则当前结点无下一节点。

}

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
        if (pNode == null)
            return pNode;
        //case 1 该结点有右子树
        TreeLinkNode pNext = null;
         if(pNode.right != null){
             TreeLinkNode p1= pNode.right;
             while(p1.left!= null){
                 p1= p1.left;
             }
              pNext= p1;
         }else{
        //case 2 该结点无右子树
        //该结点为父节点的左结点,则该父节点就是下一个结点
        //该结点为父节点的右节点,则向上遍历至当前结点为父节点的左结点或无父节点
           if( pNode.next != null){
            TreeLinkNode current = pNode;
            TreeLinkNode parent = pNode.next;
            while(current.next!=null && parent.right == current){
                current = parent;
                parent = parent.next;
            }
            pNext= parent;
        }
         }
        return pNext;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值