码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer:二叉树的下一节点

时间:2020-03-14 23:43:15      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:code   text   左右子树   nod   src   img   pre   https   sdn   

题意描述

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

解题思路

一、暴力解决

分析Node可能在二叉树的所有位置,逐个进行分析。

  1. 若node的右子树不为空,中序遍历的下一节点是右子树的最左节点。
  2. 若node的右子树为空,左子树不为空,中序遍历的下一节点是父节点。
  3. 若node的右子树为空,左子树空,说明是node是叶子节点。
  4. 若node为左叶子,中序遍历的下一节点是父节点。
  5. 若node是右叶子,中序遍历的下一节点是祖父节点。
  6. 特殊情况:①二叉树只有node节点。②斜树。
    public TreeLinkNode GetNext(TreeLinkNode pNode){
        if(pNode == null) return null;  //pNode为空
        if(pNode.right != null){    //右子树不为空
            pNode = pNode.right;    
            while(pNode.left != null) 
                pNode = pNode.left;
            return pNode;   //右子树的最左节点
        }else if(pNode.right == null && pNode.left != null){    //右子树为空,左子树不为空
            return pNode.next;  //返回父节点
        }else{  //左右子树都为空,说明是叶子节点
            if(pNode.next == null) return null; //父节点为空,说明只有一个节点
            if(pNode.next.left == pNode) return pNode.next; //左叶子节点,返回父节点
            else{   //右叶子节点
                TreeLinkNode node = pNode.next;
                while(node.next != null)    
                    node = node.next;   //先找到根节点
                while(node.right != null)
                    node = node.right;
                if(node == pNode){
                    return null;    //斜树的右叶子节点
                }else{
                    return pNode.next.next; //普通情况,右叶子节点返回祖父节点
                }
            }
            
        }
    }

二、优化

技术图片

如图所示,可以发现

  1. 又右子树的,下一节点就是右子树的最左节点。(eg:D,B,E,A,C,G)

  2. 没有右子树的,可以分为

    (1)父节点的左孩子(eg:N,I,L),父节点就是下一节点

    (2)父节点的右孩子(eg:H,J,K,M),向上查找父节点,直到当前节点父节点左孩子。如果没有返回尾节点。

     public TreeLinkNode GetNext(TreeLinkNode pNode){
        if(pNode == null) return null;  //pNode为空
         if(pNode.right != null){       //右子树不为空
            pNode = pNode.right;    
             while(pNode.left != null) pNode = pNode.left;
             return pNode;      //返回右子树的最小值
         }
         while(pNode.next != null){     //查找当前节点是父节点的左节点的节点
            if(pNode.next.left == pNode){
                return pNode.next;  //返回当前节点的父节点
            }
             pNode = pNode.next;
         }
         return null;   //否则返回null
     }

剑指offer:二叉树的下一节点

标签:code   text   左右子树   nod   src   img   pre   https   sdn   

原文地址:https://www.cnblogs.com/le-le/p/12494910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!