二叉树的前序,中序,后序遍历,广度遍历。
二叉树求深度,求叶子节点个数,判断是否为完全二叉树
tips:关于二叉树的绝大多数问题都可以用递归方法来实现,DFS。一位二叉树根节点去掉之后又分为两个子树,对于子树本身也可以看左二叉树来处理。所以递归可以说很好用了
二叉树的建立:
public class BitTree
{
int data;
BitTree lchild;
BitTree rchild;
public BitTree()
{
}
public BitTree(int data)
{
this.data=data;
this.lchild=this.rchild=null;
}
public static BitTree createBitTree(Scanner reader)
{//递归 DFS
BitTree root=null;
int m=reader.nextInt();
if(m>0)
{
root=new BitTree(m);
root.lchild=createBitTree(reader);
root.rchild=createBitTree(reader);
}
return root;
}
前序 中序 后序 ,我在这里就不写递归了,太简单了:
public static void vistedByPre(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
stack.push(root);
while(!stack.isEmpty())
{
root=stack.pop();
System.out.print(" "+root.data);
if(root.rchild!=null) stack.push(root.rchild);
if(root.lchild!=null) stack.push(root.lchild);
}
}
public static void vistedByPre1(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
while(root!=null)
{
System.out.print(" "+root.data);
stack.push(root);
root=root.lchild;
}
while(!stack.isEmpty())
{
root=stack.pop();
root=root.rchild;
while(root!=null)
{
System.out.print(" "+root.data);
stack.push(root);
root=root.lchild;
}
}
}
public static void vistedByMid(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
stack.push(root);
while(!stack.isEmpty())
{
root=stack.pop();
if(root==null) return;
if((root.lchild==null&&root.rchild==null)||(root.rchild==stack.top()&&!stack.isEmpty()))
{
System.out.print(" "+root.data);
continue;
}
stack.push(root.rchild);
stack.push(root);
if(root.lchild!=null) stack.push(root.lchild);
}
}
public static void vistedByMid1(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
while(root!=null)
{
stack.push(root);
root=root.lchild;
}
while(!stack.isEmpty())
{
root=stack.pop();
System.out.print(" "+root.data);
root=root.rchild;
while(root!=null)
{
stack.push(root);
root=root.lchild;
}
}
}
public static void vistedByBack(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
stack.push(root);
BitTree visted=root;
while(!stack.isEmpty())
{
root=stack.pop();
if((root.lchild==null&&root.rchild==null)||
(root.lchild==visted&&root.rchild==null)
||(root.rchild==visted))
{
System.out.print(" "+root.data);
visted=root;
continue;
}
stack.push(root);
if(root.rchild!=null) stack.push(root.rchild);
if(root.lchild!=null) stack.push(root.lchild);
}
}
public static void vistedByBack1(BitTree root)
{
if(root==null) return;
ArrayStackT<BitTree> stack=new ArrayStackT<BitTree>(20);
BitTree visted=root;
while(root!=null)
{
stack.push(root);
root=root.lchild;
}
while(!stack.isEmpty())
{
root=stack.pop();
if((root.lchild==null&&root.rchild==null)||
(root.rchild==visted)||root.rchild==null)
{
System.out.print(" "+root.data);
visted=root;
continue;
}
stack.push(root);
root=root.rchild;
while(root!=null)
{
stack.push(root);
root=root.lchild;
}
}
}
广度遍历二叉树:
public static void vistedByGuangDu(BitTree root)
{
if(root==null) return;
ArrayQueueT<BitTree> queue=new ArrayQueueT<BitTree>(20);
queue.inQueue(root);
while(!queue.isEmpty())
{
root=queue.outQueue();
System.out.print(" "+root.data);
if(root.lchild!=null)
queue.inQueue(root.lchild);
if(root.rchild!=null)
queue.inQueue(root.rchild);
}
}
求叶子节点个数:
public static int getYeZiJieDian(BitTree root) //叶子节点数 深度遍历递归算法
{
if(root==null) return 0;
if(root.lchild==null&&root.rchild==null) return 1;
return (getYeZiJieDian(root.lchild)+getYeZiJieDian(root.rchild));
}
求二叉树深度:
public static int getShendu(BitTree root)//求深度 DFS
{
if(root==null) return 0;
else
{
int leftH=getShendu(root.lchild);
int rightH=getShendu(root.rchild);
return Math.max(leftH, rightH)+1;
}
}
判断是否为完全二叉树:
public boolean isWanQuanBitTree(BitTree root)//广度遍历 一层一层的来遍历 BFS
{
if(root==null) return true;
ArrayQueueT<BitTree> queue=new ArrayQueueT<BitTree>();
queue.inQueue(root);
while(!queue.isEmpty())
{
root=queue.outQueue();
if(root.lchild==null&&root.rchild!=null)
return false;
if(root.lchild!=null);
queue.inQueue(root.lchild);
if(root.rchild!=null)
queue.inQueue(root.rchild);
if(root.rchild==null)//右孩子为空时,那么接下来的节点的左右孩子只要有一个为空就不是完全二叉树。
{
while(!queue.isEmpty())
{
root=queue.outQueue();
if(root.lchild!=null||root.rchild!=null)
return false;
}
}
}
return true;
}
需要好好理会递归的思想 那么对于树的相关知识,就会看起来相对简单一点