Question 538: Convert a binary search tree to an accumulative tree (reverse in-order traversal, Morris traversal)

1. Title

Insert picture description hereInsert picture description hereInsert picture description here

2. My initial thoughts and problems

Slightly, look directly at the solution

3. Problem solving method 1: reverse middle order traversal

Insert picture description hereInsert picture description here

class Solution {
    
    
    int sum = 0;

    public TreeNode convertBST(TreeNode root) {
    
    
        if (root != null) {
    
    
            convertBST(root.right);
            sum += root.val;
            root.val = sum;
            convertBST(root.left);
        }
        return root;
    }
}

Insert picture description here

4. Problem solving method 2: Morris traversal

Insert picture description hereInsert picture description here

class Solution {
    
    
    public TreeNode convertBST(TreeNode root) {
    
    
        int sum = 0;
        TreeNode node = root;

        while (node != null) {
    
    
            if (node.right == null) {
    
    
                sum += node.val;
                node.val = sum;
                node = node.left;
            } else {
    
    
                TreeNode succ = getSuccessor(node);
                if (succ.left == null) {
    
    
                    succ.left = node;
                    node = node.right;
                } else {
    
    
                    succ.left = null;
                    sum += node.val;
                    node.val = sum;
                    node = node.left;
                }
            }
        }

        return root;
    }

    public TreeNode getSuccessor(TreeNode node) {
    
    
        TreeNode succ = node.right;
        while (succ.left != null && succ.left != node) {
    
    
            succ = succ.left;
        }
        return succ;
    }
}

Insert picture description here

Guess you like

Origin blog.csdn.net/ambitionLlll/article/details/114365656