二叉树遍历中构造前后指针

1. 何为前后指针

在二叉树的一些题目中,需要我们记录前后两个相邻节点各自的信息(尤其是在二叉搜索树中经常出现,比如501和530,那么常用的技巧就是在遍历过程中设置两个指针,分别指向这两个相邻节点,在处理之后,将前一个指针指向当前节点,当前指针指向下一个节点。

2. 递归中构造前后指针

class Solution{
    private:
        TreeNode* pre;
        void traversal(TreeNode* cur){
            if(cur == NULL)return;
            traversal(cur->left); //左
            if(pre != NULL){ //中
                //处理cur和pre
            }
            pre = cur; //将前一个指针指向当前节点
            traversal(cur->right); //右
        }
    public:
        TreeNode* getMinimumDifference(TreeNode* root){
            traversal(root);
            return root;
        }
}

这里使用的是前序遍历,实际中根据需要自行修改即可。

3. 迭代中构造前后指针

class Solution{
    public:
        TreeNode* getMinimumDifference(TreeNode* root){
            stack<TreeNode*> stk;
            if(root == NULL)return root;
            TreeNode* pre = NULL;
            TreeNode* cur = root;
            while(!stk.empty() || cur != NULL){
                if(cur != NULL){
                    stk.push(cur);
                    cur = cur->left; //左
                }else{
                    cur = stk.top();
                    stk.pop();
                    if(pre == NULL){
                        //此时cur指向初始节点(最左下或者最右下)
                    }
                    if(pre != NULL){
                        //处理pre和cur
                    }
                    pre = cur; //前一个指针指向当前节点
                    cur = cur->right; //这里和上面对应,上面始终遍历左侧,则这里等于右子节点
                }
            }
            return root;
        }
}

相比较递归中的前后指针构造,我个人更熟悉迭代法中构造前后指针。在二叉搜索树中这样的处理方式很常见,需要慢慢体会这样的写法。