zoukankan      html  css  js  c++  java
  • (剑指Offer)面试题58:二叉树的下一个结点

    题目:

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

    思路:

    考虑中序遍历的过程,

    如果当前结点存在右子节点,那么当前结点的下一个结点应该为该右子树的最左边的结点;

    如果当前结点没有右子节点,那么如果当前结点的父结点p->parent为其父结点的父结点p->parent->patent的左子结点,那么当前结点的下一结点即为其父结点;否则继续往上遍历,直至找到一个结点为其父结点的左子结点,那么该结点即为当前结点的下一结点,如果找不到,则返回NULL;

    (文字描述比较晦涩,大家可以画图看看)

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/9023a0c988684a53960365b889ceaf5e?rp=3

    AC代码:

    using namespace std;
    /*
    struct TreeLinkNode {
        int val;
        struct TreeLinkNode *left;
        struct TreeLinkNode *right;
        struct TreeLinkNode *next;
        TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
            
        }
    };
    */
    
    class Solution {
    public:
        TreeLinkNode* GetNext(TreeLinkNode* pNode)
        {
            if(pNode==NULL)
                return NULL;
            if(pNode->right!=NULL){
                TreeLinkNode* pTmp=pNode->right;
                while(pTmp->left!=NULL){
                    pTmp=pTmp->left;
                }
                return pTmp;
            }
            else{
                while(pNode->next!=NULL){
                    if(pNode==pNode->next->left)
                        return pNode->next;
                    pNode=pNode->next;
                }
                return NULL;
            }
        }
    };
  • 相关阅读:
    BZOJ3790 神奇项链
    Tarjan求Lca
    Manacher算法--Poj3974
    [Usaco2015 Feb]Censoring
    扩展Kmp
    Ural1297 最长回文串
    [Usaco2007 Dec] 队列变换
    Pku2774 最长公共子串
    Spoj 694 Distinct Substrings
    Pku1734 Musical Theme 不可重叠最长重复子
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4709117.html
Copyright © 2011-2022 走看看