
- 最近迷上了二叉树,昨天我写了子树判断,发现用判断和递归去处理二叉树是很好理解的方式,至少对于我是这样的。考虑左右子树为空与否设置判断条件,如果为空,则赋值给对称的节点然后把不为空的置空,然后注意交换的是树结构,不是节点的值。
public void Mirror(TreeNode root) {
if(root == null||(root.left == null && root.right == null))
{
}
else if(root.left != null && root.right == null)
{
root.right = root.left;
root.left = null;
root = root.right;
Mirror(root);
}
else if(root.right != null && root.left == null)
{
root.left = root.right;
root.right = null;
root = root.left;
Mirror(root);
}
else if(root.left != null && root.right != null)
{
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
Mirror(root.right);
Mirror(root.left);
}
}
- 最开始犯了很低级的错误把后面的判断只写了if并没有写else if 导致程序运行了多余的代码造成结果的错误。
- 写习惯了,用一个引用去指代节点,也就是如下方式,我感觉更加的清晰。
TreeNode p = root;
if(p == null)
{
}
else if(p.left == null && p.right == null)
{
}
else if(p.left != null && p.right == null)
{
p.right = p.left;
p.left = null;
p = p.right;
Mirror(p);
}
else if(p.right != null && p.left == null)
{
p.left = p.right;
p.right = null;
p = p.left;
Mirror(p);
}
else if(p.left != null && p.right != null)
{
TreeNode temp = p.left;
p.left = p.right;
p.right = temp;
Mirror(p.right);
Mirror(p.left);
}