JZ8 二叉树的下一个结点

发布时间 2023-04-07 23:46:47作者: luxiayuai
做法一:直接求出中序遍历,并用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;

    }
};