題目是說,如果左右子樹都不存在又自已為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; } }