二叉树的下一个结点

你快乐吗?

Posted by bbkgl on October 12, 2019

魑魅搏人应见惯

总输他

覆雨翻云手

C++,二叉树的中序遍历。

中序的下一个结点只有三种情况:

  • 右子树的最左结点
  • 父节点中左儿子也是当前节点父节点的结点(就是这么绕。。。)
  • 空结点

根据如上结论,就能写出代码了:

/*
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) return nullptr;
        if (pNode->right) return inorder(pNode->right);
        else if (pNode->next) {
            while (pNode->next && pNode->next->left != pNode) pNode = pNode->next;
            return pNode->next;
        } else return nullptr;
    }
    
    TreeLinkNode *inorder(TreeLinkNode* pNode) {
        if (pNode->left) return inorder(pNode->left);
        else return pNode;
    }
};