Binary Tree Pruning

題目是說,如果左右子樹都不存在又自已為0,就去掉那個子樹(設為null)

recursive後序,左子樹,右子樹,然後是根

自已同時又是別人的子樹,所以要告訢根自已是不是存在

 

從a開始,左右子樹都不存在,而自已是1 所以傳回true 告訢 root(c) 左子樹a 不可以刪掉(存在)

b,左右子樹都不存在,而自已是0 所以傳回false 告訢 root(c) 右子樹b 可以刪掉(不存在)

c,右子樹b可以刪除,把right = null,左子樹不可刪。雖然自已是0,可是左子樹存在所以傳回true,告訴root(e)不能刪掉自已這個子樹

d,傳回false,告誅root(e) 子樹d可以刪除

e,刪除 d子樹,傳回true

-----------------------------------------------------------

總之,左右子樹要告訢root自已可不可以被刪除,root執行刪除動作,不斷recursive

public class TreeNode
    {
        public int val;
        public TreeNode left;
        public TreeNode right;
        public TreeNode(int x) { val = x; }
    }

    public class Solution
    {
        public TreeNode PruneTree(TreeNode root)
        {
            PostOrderTraverse(root);

            return root;
        }

        bool PostOrderTraverse(TreeNode node)
        {
            //到leaf則此子樹沒有後續
            if (node == null) return false;
            //左子樹是否存在
            bool isLeftExist = PostOrderTraverse(node.left);
            //右子樹是否存在
            bool isRightExist = PostOrderTraverse(node.right);

            if(isLeftExist == false)
            {
                node.left = null;
            }

            if(isRightExist == false)
            {
                node.right = null;
            }

            bool isThisTreeExist = false;
            //根為1 或左子樹存在 或右子樹存在 則此子樹存在
            if(node.val == 1 || isLeftExist || isRightExist)
            {
                isThisTreeExist = true;
            }

            return isThisTreeExist;

        }
    }

猜你喜欢

转载自www.cnblogs.com/seako/p/10867183.html