• 二叉树的下一个中序节点


    题目描述

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

    分析

    • 如果有右子树:那就是右子树的最左节点
    • 如果没有右子树:向上找祖先,如果它是该祖先的左子孙,则是; 如果找不到,那本身就是最后一个节点,下一个是null

    代码

    public class TreeLinkNode {
        public int val;
        public TreeLinkNode left = null;
        public TreeLinkNode right = null;
        public TreeLinkNode next = null; //指向父节点
        public TreeLinkNode(int val)
        { this.val = val;
        }
    }
    public TreeLinkNode getNext(TreeLinkNode n){
            if (n==null)return null;
            if (n.right!=null){//有右子树:找右子树最左节点
                TreeLinkNode left = n.right;
                while (left.left!=null)left= left.left;
                return left;
            }else{//没有右子树,找为其左子孙的第一个祖先。
                TreeLinkNode father = n;
                while (father!=null){
                    if (father.next!=null && father.next.left == father)return father.next;
                    father = father.next;
                }
                return null;//找不到,那它本身就是最后一个,下一个是null
            }
    }
    

    扩展思考

    如果是前序,怎么找?

    • 有左子节点,就是左子节点
    • 没有左子节点:
      • 有右子节点:就是右子节点
      • 没有右子节点(叶节点):向上找,找祖先的右子节点(异己的)

    如果是后序,怎么找?
    后序说明当前节点的子节点都在自己前面,只有父节点在自己后面。

    • 如果没有父节点(根节点):下一个是null
    • 有父节点:
      • 父节点右子节点是自己或者为空:下一个就是父节点
      • 父节点右子节点不为空且不是自己(即作为左节点):找该右子树的最左节点
  • 相关阅读:
    UIScrollView的滚屏
    ASIHTTPRequest 详解, 够详细
    Libxml2中使用xpath解析xml问题
    new Random()结果相同问题
    UINavigationController使用的一些技巧
    Objectivec 模拟http请求
    开发视频网站,asp.net视频文件转换.flv格式(转)
    jqueryjCarousel 配置选项
    NSDate和NSString之间的转换,(可以转时区的哈)
    NSLog的格式
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/13188040.html
Copyright © 2020-2023  润新知