关于二叉树的一些问题

二叉树的前序,中序,后序遍历,广度遍历。

二叉树求深度,求叶子节点个数,判断是否为完全二叉树

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;
		
	}

需要好好理会递归的思想 那么对于树的相关知识,就会看起来相对简单一点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值