JZ8 二叉树的下一个结点

做法一:直接求出中序遍历,并用vector容器存储。
复制代码
/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
#include <exception>
class Solution {
public:
    vector<TreeLinkNode*> nodes;
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        TreeLinkNode *root = pNode;

        while(root->next) root = root->next;

        Inorder(root);
        int n = nodes.size();

        for(int i = 0; i < n - 1; i ++ )//最后一个肯定不存在下一个节点
        {
            if(pNode == nodes[i]){
                return nodes[i + 1];
            }
        }
        return nullptr;
    }

    void Inorder(TreeLinkNode* &root){
        if(root == nullptr) return;//中序遍历终止条件
        Inorder(root->left);
        nodes.push_back(root);
        Inorder(root->right);
    }
};
复制代码

作法二:

二叉树的中序遍历的下一个节点存在三种情况:

1.自身存在右子树,返回右子树的最左边的节点

2.自身是父节点的左子树,则返回父节点

3.自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点

复制代码
/*
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 == nullptr) return nullptr;//最好包括,防止头节点传入空指针导致程序报错
        //自身存在右子树,返回右子树的最左边的节点
        if(pNode->right){
            TreeLinkNode *rchild = pNode->right;
            while(rchild->left) rchild = rchild->left;
            return rchild;
        }
        //自身是父节点的左子树,则返回父节点
        if(pNode->next && pNode->next->left == pNode) {
            return pNode->next;
        }
        //自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点
        if(pNode->next){
            TreeLinkNode *ppar = pNode->next;
            while(ppar->next && ppar->right == ppar)
                ppar = ppar->next;
            return ppar->next;
        }
        return nullptr;

    }
};
复制代码

 

posted @   luxiayuai  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示