zoukankan      html  css  js  c++  java
  • 面试题8:二叉树的下一个结点

    NowCoder

    <?php
    header("content-type:text/html;charset=utf-8");
    /*
     * 二叉树的下一个结点 P65
     * 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
     */
    class TreeLinkNode{
        var $val;
        var $left = NULL;
        var $right = NULL;
        var $next = NULL;
        function __construct($x){
            $this->val = $x;
        }
    }
    function getNext($pNode)
    {
        if($pNode->right == null && $pNode->next == null){  //如果既没有右子树有没有父结点,那么它的中序遍历就没有后继结点
            return null;
        }
    
        if($pNode->right != null){           //如果有右子树,那下一结点就是其右子树最左边的子树
            $cur = $pNode->right;
            while ($cur->left != null){
                $cur = $cur->left;
            }
            return $cur;
        }
        else if($pNode->next != null){
            //如果没有右子树,但是是有父结点,那还要判断该结点是其父结点的左子树还是右子树,
            //如果是它是其父结点左子树,那么这个父结点就是其后继结点,
            //如果它是其父结点的右子树,那还要继续找父结点,直到遍历道的结点是其父结点的左子树,才是找到了后继结点
            $parent = $pNode->next;
            $cur = $pNode;
            while ($parent != null && $cur == $parent->right){
                $cur = $parent;
                $parent = $parent->next;
            }
            if($cur == $parent->left){
                return $parent;
            }
            else{
                return null;
            }
    
        }
    
    }
    $head = new TreeLinkNode(1);
    $head->left = new TreeLinkNode(2);
    $head->right = new TreeLinkNode(3);
    $head->left->next = $head;
    $head->right->next = $head;
    
    print_r(getNext($head));
  • 相关阅读:
    BZOJ1316 树上的询问
    BZOJ2599 IOI2011Race
    BZOJ2594 [Wc2006]水管局长数据加强版
    BZOJ3052 [wc2013] 糖果公园 【树上莫队】
    BZOJ4530 BJOI 2014 大融合
    QTREEⅠ SPOJ
    BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
    BZOJ3669 NOI2014魔法森林
    BZOJ2002 弹飞绵羊
    BZOJ1878 [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/10155110.html
Copyright © 2011-2022 走看看