【题28 对称的二叉树】
【题目】
请实现一个函数,用来判断一棵二叉树是不是对称的,如果一棵二叉树和他的镜像一样,那么它是对称的
例如:
如图的3棵二叉树,第一棵二叉树是对称的,另外两棵不是
三种二叉树遍历算法:
前序遍历,中序遍历和后序遍历都是先遍历左子节点再遍历右子节点。
定义一种遍历算法:
先遍历右子节点再遍历左子节点。即先遍历父节点,再遍历它的右子节点,最后遍历它的左子节点。
树1,
前序遍历{8,6,5,7,6,7,5}
定义遍历{8,6,5,7,6,7,5} 序列一样
树2,
前序遍历{8,6,5,7,9,7,5}
定义遍历{8,9,5,7,6,7,5} 不一样
树3:
前序遍历{7,7,7,7,7,7}
定义遍历{7,7,7,7,7,7} 虽然一样,但并不对称
解决方法:定义一个空指针null
通过比较二叉树的前序遍历序列和对称遍历序列来判断二叉树是不是对称的,
如果两个序列一致,那么是对称的。
实现
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot == null) return true;
Stack<TreeNode> s = new Stack<>();
s.push(pRoot.left);
s.push(pRoot.right);
while(!s.empty()){
TreeNode right = s.pop();//成对取出
TreeNode left = s.pop();
if(right == null && left == null) continue;
if(right == null || left == null) return false;
if(right.val != left.val) return false;
//成对插入
s.push(left.left);
s.push(right.right);
s.push(left.right);
s.push(right.left);
}
return true;
}
}
参考
1。《剑指offer》