判断树的子树
思路
有关树的算法十有八九都是采用递归来实现
递归有三要素:
单独定义一个函数判断B是不是从当前A的根节点开始的子树,这里判断是不是子树也需要一个递归的判断。如果是,则返回True,如果不是,再判断B是不是从当前A的根节点的左子节点或右子节点开始的子树。
class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
public static TreeNode CreatTree(TreeNode Root) //根据先序创建二叉树
{
Scanner input=new Scanner(System.in);
int data=input.nextInt();
if(data==0)
Root=null;
else
{
Root=new TreeNode(data); //生成根节点
Root.left=TreeNode.CreatTree(Root.left); //生成左子树
Root.right=TreeNode.CreatTree(Root.right);
}
return Root;
}
}
class Solution {
public boolean isSubTree(TreeNode root1,TreeNode root2)
{
if(root1==null||root2==null)
return false;
boolean result=false; //
if(root1.val==root2.val)
result=HasSubTree(root1,root2);
if(!result)
result=isSubTree(root1.left,root2);
if(!result)
result=isSubTree(root1.right,root2);
return result;
}
public boolean HasSubTree(TreeNode root1,TreeNode root2)
{
if(root2==null)
return true;
if(root1==null)
return false;
if(root1.val!=root2.val)
return false;
return HasSubTree(root1.left,root2.left)&&HasSubTree(root1.right,root2.right);
}
public static void main(String[] args)
{
TreeNode Ta=null,Tb=null;
Ta=TreeNode.CreatTree(Ta); //创建树A 依次输入3,4,1,0,0,2,0,0,5,0,0
System.out.println("树已经创建完毕");
Tb=TreeNode.CreatTree(Tb); //创建树B 依次输入4,1,0,0,0
Solution ss=new Solution();
System.out.print(ss.isSubTree(Ta, Tb));
}
}
二叉树的镜像
思路
采用后序遍历,交换左右节点
import java.util.Scanner;
class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
public static TreeNode CreatTree(TreeNode Root) //根据先序创建二叉树
{
Scanner input=new Scanner(System.in);
int data=input.nextInt();
if(data==0)
Root=null;
else
{
Root=new TreeNode(data); //生成根节点
Root.left=TreeNode.CreatTree(Root.left); //生成左子树
Root.right=TreeNode.CreatTree(Root.right);
}
return Root;
}
}
class Solution {
public TreeNode MirrorTree(TreeNode Root)
{
if(Root!=null)
{
TreeNode temp=null;
MirrorTree(Root.left); //交换左子树
MirrorTree(Root.right);//交换右子树
//交换Root的左右节点
temp=Root.left;
Root.left=Root.right;
Root.right=temp;
}
return Root;
}
public static void main(String[] args)
{
TreeNode Root=null;
Root=TreeNode.CreatTree(Root); //创建树A 依次输入3,4,1,0,0,2,0,0,5,0,0
System.out.println("树已经创建完毕");
Solution ss=new Solution();
Root=ss.MirrorTree(Root);
}
}