二叉树
二叉树的遍历
void traverse(TreeNode root) {
// root 需要做什么? 在这做。
// 其他的不⽤ root 操⼼, 抛给框架
traverse(root.left);
traverse(root.right);
}
二叉树A中是否包含子树B
可以用递归的思想,先判断树的根节点是是否相等,若相等,则递归判断他们的子树是否相等;如果根节点不相等,则判断B树是存在在A树的左子树还是右子树
//递归
public static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if (root2 == null)
return true;
if (root1 == null)
return false;
if (hasSubtree(root1,root2))
return true;
//查找root2是否在root1的左右子树中
return HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
private boolean hasSubtree(TreeNode root1, TreeNode root2) {
if (root1 == null && root2 == null)
return true;
if (root1 == null || root2 == null){
return false;
}
return hasSubtree(root1.left,root2.left) && hasSubtree(root1.right,root2.right);
}
二叉树的镜像
递归的思想,先判断根节点是否相等,然后交换根节点的左右节点的值,交换之后对左右节点的子树再利用递归的思想进行镜像
//递归
public TreeNode Mirror (TreeNode pRoot) {
if(pRoot == null)
return null;
if(pRoot != null){
TreeNode temp = pRoot.left;
pRoot.left = pRoot.right;
pRoot.right = temp;
if(pRoot.left != null){
Mirrot(pRoot.left);
}
if(pRoot.right != null){
Mirror(pRoot.right);
}
}
return pRoot;
}