树的判断

树的结构为

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) 
    { 
        val = x; 
    }
}

判断两个树结构是否相同

https://leetcode.com/problems/same-tree/
Given two binary trees, write a function to check if they are equal or not.
Two binary trees are considered equal if they are structurally identical and the nodes have the same value.
递归判断左右子树即可,结构和节点值都要相同

public boolean isSameTree(TreeNode p, TreeNode q) {
    if(p == q == null) return true;
    else if(p != null && q != null && p.val == q.val) 
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    else return false;
}

判断树是否对称

https://leetcode.com/problems/symmetric-tree/
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

Bonus points if you could solve it both recursively and iteratively.
递归方式:

public boolean isSymmetricRecursively(TreeNode root){
    return root == null? true : symmetric2Tree(root.left, root.right);
}
private boolean symmetric2Tree(TreeNode n1, TreeNode n2){
    if(n1 == null && n2 == null) return true;
    else if(n1 != null && n2 != null && n1.val == n2.val)
        return symmetric2Tree(n1.left, n2.right) && symmetric2Tree(n1.right, n2.left);
    else return false;
}

循环方式:
可以层次遍历,查看每层是否是对称串O(nlogn);
也可以运用递归方式的循环形式O(n)
【此处采用O(n)的】

public boolean isSymmetric(TreeNode root){
    if(root == null) return true;
    Deque<TreeNode> deque = new ArrayDeque<TreeNode>();
    if(root.left != null) deque.add(root.left);
    if(root.right != null) deque.add(root.right);
    while(!deque.isEmpty()){
        TreeNode t1, t2 = null;
        t1 = deque.pollLast();
        if(!deque.isEmpty()) t2 = deque.pollLast();
        if(t1 != null && t2 != null && t1.val == t2.val);
        else return false;
        if(t1.left == null && t2.right == null);
        else if(t1.left != null && t2.right != null){
            deque.add(t1.left);
            deque.add(t2.right);
        }else return false;
        if(t2.left == null && t1.right == null);
        else if(t2.left != null && t1.right != null){
            deque.add(t2.left);
            deque.add(t1.right);
        }else return false;
    }
    return true;
}

判断二叉树是否为完全二叉树

完全二叉树是指与满二叉树相比,位置相同的节点标号一定相同的。
采用层次遍历,设置标志位,标志是否遍历到结束节点.当标志位为false时,若后面还有孩子,就不是完全二叉树。

boolean IfCompleteTree(TreeNode root){
    if(root == null) return false;
    boolean flag = true;
    Deque<TreeNode> deque = new ArrayDeque<TreeNode>();
    deque.add(root);
    while(!deque.isEmpty()){
        TreeNode tn = deque.pollFirst();
        if(flag && tn.left != null) deque.add(tn.left);
        else if(!flag) return false;
        else flag = false;
        if(flag && tn.right != null) deque.add(tn.right);
        else if(!flag) return false;
        else flag = false;
    }
    return true;
}

判断一个树是否是另一个树的子结构

剑指offer18:树的子结构
判断t2是不是t1的子结构:先找到t1中与t2的根相同值的节点,再判断该节点一下是否与t2同结构

public boolean HasSubTree(TreeNode t1, TreeNode t2){
    if(t2 == null) return true;
    else if(t1 == null) return false;
    else if(t1.val == t2.val && sameTree(t1, t2)) return true;
    else return HasSubTree(t1.left, t2) || HasSubTree(t1.right, t2);
} //找与t2根节点值相同的树t1中的节点
private boolean sameTree(TreeNode t1, TreeNode t2){
    if(t2 == null) return true;
    else if(t1 == null) return false;
    else if(t1.val == t2.val) return sameTree(t1.left, t2.left)&&sameTree(t1.right, t2.right);
    else return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值