题目链接:
思路:先通过层次遍历将a树中和b树根节点相同值的结点全部存入缓存数组,然后遍历缓存数组,通过判断二树结构是否相同的递归方法,来返回值
需要注意的点:在递归函数中,不能判断到A树的空值就返回,必须先改一下标记,否则很可能b树此处不为空而a树为空导致错误判断
代码实现:
package niuke; public class 树的子结构 { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1==null||root2==null) return false; /** * 使用层次遍历找出大一些的树中第二颗子树的根节点 */ TreeNode[] queue = new TreeNode[1000]; int front = 0; int rear = 0; rear = (rear+1)%1000; TreeNode tn = root1; queue[rear] = tn; TreeNode[] buffer = new TreeNode[1000]; int index = 0; while(front!=rear){ front = (front+1)%1000; tn = queue[front]; if(tn.val==root2.val){ buffer[index] = tn; index++; } if(tn.left!=null) { rear = (rear + 1) % 1000; queue[rear] = tn.left; } if(tn.right!=null) { rear = (rear + 1) % 1000; queue[rear] = tn.right; } } boolean flag_in = false; for(TreeNode each :buffer){ flag = true; if(each==null) break; inOrderTraversal(each,root2); if(flag){ flag_in = true; break; } } return flag_in; } private boolean flag = true; private void inOrderTraversal(TreeNode root1,TreeNode root2){ if(root2==null)return; if(root1==null||root1.val!=root2.val){ flag = false; return; } inOrderTraversal( root1.left, root2.left); inOrderTraversal( root1.right, root2.right); } }
代码已经ac
希望对大家有所帮助
以上