二叉樹的鏡像
題目描述
操作給定的二叉樹,將其變換爲源二叉樹的鏡像。
輸入描述:
二叉樹的鏡像定義:
原二叉樹 :
8
/ \
6 10
/ \ / \
5 7 9 11
鏡像二叉樹:
8
/ \
10 6
/ \ / \
11 9 7 5
思路分析:
先前序遍歷這棵樹的每個結點,如果遍歷的節點有子節點,那麼就進行左右子節點的交換。
遞歸實現:
public void Mirror(TreeNode root) {
if (root == null) {
return;
}
TreeNode tmp = null;
tmp = root.left;
root.left = root.right;
root.right = tmp;
if (root.left != null ){
Mirror(root.left);
}
if (root.right != null){
Mirror(root.right);
}
}
非遞歸實現:
public void Mirror(TreeNode pRoot) {
if (pRoot == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(pRoot);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null || node.right != null) {
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
}
對稱的二叉樹
題目描述:
請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。
思路分析:
例如一下二叉樹,這就是個典型的對稱二叉樹。對稱二叉樹是必須滿足鏡像對稱,也就是從根節點中間切開,對摺可以重合。即:根節點的左子樹和右子樹相同,左子樹的左子樹和右子樹的右子樹相等,左子樹的右子樹和右子樹的左子樹相等,可以採用遞歸和非遞歸兩種方法實現。
6
/ \
8 8
/ \ / \
1 3 3 1
遞歸實現:
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val){
this.val = val;
}
}
public static boolean isSymmetrical(TreeNode pRoot)
{
if (pRoot == null) {
return true;
}
return comRoot(pRoot.left, pRoot.right);
}
private static boolean comRoot(TreeNode left, TreeNode right) {
if (left == null)
return right == null;
//執行到這裏已經說明left!=null
if (right == null)
return false;
//這裏千萬別大意寫成left != right,這樣肯定會一直輸出false,因爲比較的是對象
if (left.val != right.val)
return false;
//如果左子樹和右子樹的根節點相等,繼續遞歸比較它們左子樹的左子樹節點和右子樹的右子樹節點,
//以及左子樹的右子樹節點和右子樹的左子樹節點。
return comRoot(left.left, right.right) && comRoot(left.right, right.left);
}
非遞歸代碼實現:
非遞歸實現的思路就是將每一對稱節點的左子樹和和右子樹,右子樹和左子樹添加到隊列進行判斷,注意這裏空節點即:null會添加到隊列中,但是如果取出的兩個元素爲空,那麼結束當前while循環,重新進行取值。
public static boolean isSymmetrical(TreeNode pRoot){
if(pRoot == null) return true;
LinkedList<TreeNode> queue = new LinkedList<>();
//元素爲空也會添加入隊列
queue.add(pRoot.left);
queue.add(pRoot.right);
while(!queue.isEmpty()) {
TreeNode left = queue.pop();//成對取出
TreeNode right = queue.pop();
//如果成對取出的兩個元素均爲空,當前while循環結束,重新再隊列中取元素
if(left == null && right == null) continue;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
//成對插入
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}