2 二叉树篇
2.1 判断二叉树2是否是二叉树1的子树
public class TreeTest{
public boolean hasSubTree(TreeNode root1,TreeNode root2){
boolean result=false;
if(root1!=null&&root2!=null){
if(root1.data==root2.data){
result=doesTree1HasTree2(root1,root2);
}
if(!result){
//进入左子树或者右子树中继续查找
return hasSubTree(root1.left,root2)||hasSubTree(root1.right,root2);
}
}
return result;
}
public boolean doesTree1HasTree2(TreeNode node1,TreeNode node2){
if(node1==null)
return true;
if(node2==null)
return true;
if(node1.data!=node2.data){
return false;
}
return doesTree1HasTree2(node1.left,node2.left)&&doesTree1HasTree2(node1.right,node2.right);
}
}
2.2将二叉树镜像翻转
public void mirror(TreeNode root){
if(root==null)
return;
//借助辅助栈
Stack<TreeNode> stack=new Stack<TreeNode>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
TreeNode tmp=root.left;
root.left=root.right;
root.right=tmp;
stack.push(root);
root=root.left;
}
//节点出栈
while(!stack.isEmpty()){
root=stack.pop();
root=root.right;
}
}
}
2.3二叉树的广度遍历(层序遍历)
public ArrayList<Integer> visitFromTopToBottom(TreeNode root){
ArrayList<Integer> list=new ArrayList<Integer>();
if(root==null)
return list;
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode node=queue.poll();
list.add(node.data);
if(node.left!=null){
queue.addLast(node.left);
}
if(node.right!=null){
queue.addLast(node.right);
}
}
return list;
}
2.4判断某个数组是否是搜索二叉树的后续遍历
public boolean verifySequenceOfBST(int[] sequence){
if(sequence==null||sequence.length==0)
return false;
//表示右子树起始位置
int rstart=0;
int length=sequence.length;
//找到右子树起始位置,然后对左右子树进行递归处理
for(int i=0;i<sequence.length-1;i++){
if(sequence[i]<sequence[length-1]){
rstart++;
}
}
if(rstart==0){
verifySequenceOfBST(Arrays.copyOfRange(sequence,0,length-1))
}else{
for(int i=rstart;i<length-1;i++){
if(sequence[i]<=sequence[length-1])
return false;
}
verifySequenceOfBST(Arrays.copyOfRange(sequence,0,rstart));
verifySequenceOfBST(Arrays.copyOfRange(sequence,rstart,length-1));
}
return true;
}
2.5二叉搜索树转化为排序双向链表
public TreeNode convert(TreeNode pRootOfTree){
TreeNode lastList=convertNode(pRootOfTreeNode,null);
TreeNode pHead=lastList;
while(pHead!=null&&pHead.left!=null){
pHead=pHead.left;
}
return pHead;
}
public TreeNode convertNode(TreeNode root,TreeNode lastList){
if(root==nulll)
return null;
TreeNode cur=root;
if(cur.left!=null){
lastList=convertNode(cur.left,lastList);
}
cur.left=lastList;
if(lastList!=null){
lastList.right=cur;
}
lastList=cur;
if(cur.right!=null){
lastList=convertNode(cur.right,lastList);
}
return lastList;
}
2.6 求二叉树的深度
public int treeDepth(TreeNode root){
if(root==null)
return 0;
int left=treeDepth(root.left);
int right=treeDepth(root.right);
return left>right? left+1:right+1;
}
2.7 求二叉搜索树中第k个节点
题设是二叉搜索树,我们知道二叉搜索树左孩子节点的值小于根节点,右孩子节点的值大于根节点。按照中序遍历的次序遍历二叉树得到的刚好是排序好的数组。按照这个思路,我们做如下实现
int count=0;
public TreeNode getKthNode(TreeNode pRoot,int k){
if(pRoot==null||k<1)
return null;
count++;
if(count==k)
return pRoot;
TreeNode leftNode=getKthNode(pRoot.left,k);
if(leftNode!=null)
return leftNode;
TreeNode rightNode=getKthNode(pRoot.right,k);
if(rightNode!=null)
return rightNode;
return null;
}