Leetcode - 对称树

http://oj.leetcode.com/submissions/detail/2861451/
[quote]
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

1
/ \
2 2
/ \ / \
3 4 4 3
But the following is not:
1
/ \
2 2
\ \
3 3
[/quote]

1. 用递归相对简单
2. 非递归,注意要点有
[list]
[*] 向stack 里放子结点时要从右到左,先放结点的右结点,再放左结点,那样pop出来时,才会从左到右,提交了好多次才成功!
[*] 判断左子结点与右子结点数目一致,还不够,因为如上图,3443,第一个4有子树,然后第二个3有子树,数目一样,但位置不同!
[/list]


public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isSame(root);
}

public boolean isSame(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (stack.size() > 0) {
TreeNode[] nodes = new TreeNode[stack.size()];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = stack.pop();
}

if (nodes.length % 2 != 0) {
if (nodes.length == 1) {
if (nodes[0] != root) {
return false;
}
} else {
return false;
}
}

int mid = nodes.length / 2;
for (int i = 0; i < mid; i++) {
TreeNode l = nodes[i];
TreeNode r = nodes[nodes.length - i - 1];

if (l == null || r == null) {
if (l != r) {
return false;
}
} else if (l.val != r.val) {
return false;
}
}
int leftNb = 0;
int rightNb = 0;
for (int i = nodes.length - 1; i >= 0; i--) {
if (nodes[i] == null) {
continue;
}
if (nodes[i].right != null) {
stack.push(nodes[i].right);
rightNb++;
} else {
stack.push(null);
}
if (nodes[i].left != null) {
stack.push(nodes[i].left);
leftNb++;
} else {
stack.push(null);
}
}
if (leftNb != rightNb) {
return false;
}

if (leftNb == 0) {
stack.clear();
}
}
return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值