剑指offer 66道-python+JavaScript
树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
思路
分别用python和javascript实现
首先HasSubtree函数来递归遍历根节点,当两树的根节点相同时,再用similar函数递归判断两个树的左右子节点相不相同。
递归实现时,要写好递归的跳出条件。具体细节已经写在代码注释里啦~
github
python代码链接: https://github.com/seattlegirl/jianzhioffer/blob/master/hassubtree.py.
题目代码(python)
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def similar(self,p,q):
#递归跳出条件
#如果tree2已经遍历完成,返回true
if q==None:
return True
#如果tree2还没有遍历完,tree1遍历完成,返回false
if p==None:
return False
#如果其中有一个点对不上了,返回false
if p.val!=q.val:
return False
#根节点对上就去子节点找
return self.similar(p.left,q.left) and self.similar(p.right,q.right)
def HasSubtree(self, pRoot1, pRoot2):
# write code here
result=False
#两个根节点都不为空,开始判断
if pRoot1!=None and pRoot2!=None:
#两个根节点相等
if pRoot1.val == pRoot2.val:
#判断两个根节点的子节点
result=self.similar(pRoot1,pRoot2)
#如果根节点那没找到,就去找左儿子节点为根节点
if not result:
result=self.HasSubtree(pRoot1.left,pRoot2)
#如果左儿子还没找到,就去找右儿子为根节点
if not result:
result=self.HasSubtree(pRoot1.right,pRoot2)
return result
tree1=TreeNode(8)
tree1.left=TreeNode(9)
tree1.right=TreeNode(2)
tree2=TreeNode(8)
tree2.left=TreeNode(9)
print(Solution().HasSubtree(tree1,tree2))
github
JavaScript代码链接: https://github.com/seattlegirl/jianzhioffer/blob/master/hassubtree.js.
题目代码(JavaScript)
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function similar(p,q){
//递归跳出条件
//如果tree2已经遍历完成,返回true
if(q==null){
return true;
}
//如果tree2还没有遍历完,tree1遍历完成,返回false
if(p==null){
return false;
}
//如果其中有一个点对不上了,返回false
if(p.val!=q.val){
return false;
}
//根节点对上就去子节点找
return (similar(p.left,q.left)&&similar(p.right,q.right));
}
function HasSubtree(pRoot1, pRoot2)
{
// write code here
var result=false;
//两个根节点都不为空,开始判断
if(pRoot1!=null && pRoot2!=null){
//两个根节点相等
if(pRoot1.val==pRoot2.val){
//判断两个根节点的子节点
result=similar(pRoot1,pRoot2);
}
//如果根节点那没找到,就去找左儿子节点为根节点
if(result==false){
result=HasSubtree(pRoot1.left,pRoot2);
}
//如果左儿子还没找到,就去找右儿子为根节点
if(result==false){
result=HasSubtree(pRoot1.right,pRoot2);
}
}
return result;
}
var tree1=new TreeNode(8);
tree1.left=new TreeNode(9);
tree1.right=new TreeNode(2);
var tree2=new TreeNode(8);
tree2.left=new TreeNode(9);
console.log(HasSubtree(tree1,tree2));