二叉树的构建以及深度优先遍历 广度优先遍历

【前言】 二叉树的遍历过程就是根据某一顺序访问树中的节点,树的几种常用遍历方法有:前序遍历、中序遍历以及后序遍历。由于二叉树属于一个无环的图,所以图中的深度优先遍历和广度(广度)优先编历也适用于二叉树。

【1.深度遍历描述】深度遍历是向深度搜索的过程,沿着各分支路径走到尽头,再返回遍历其他的节点。二叉树是无环的结构,在遍历时候只需将各个节点压入中,无需标记节点是否已经访问。深度优先遍历路径是根节点------>左子树------>右子树。

【java代码实现】

 public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
     ArrayList<Integer> list=new ArrayList<Integer>();
     Stack<TreeNode> s=new Stack<TreeNode>();
      if(root==null)
         return list;
      s.push(root);
     while(!s.isEmpty()){
        TreeNode node=s.peek();
        list.add(node.val);
         node=s.pop();
        System.out.println(node.val);// 1 2 4 3 5
        //先压右子树 后压左子树,达到左子树先出栈的效果
        if(node.right!=null){
          s.push(node.right);
          }
         if(node.left!=null){
          s.push(node.left);
          }
       }
     return list;
 }
 【入栈出栈示意】 
 

【2.广度度遍历描述】广度遍历是向层次搜索的过程,即按照二叉树的深度递增的顺序一层一层的遍历节点。在遍历时候只需将各个节点压入队列中,广度优先遍历路径是根节点------>第二层深度节点------>......------->最后一层深度节点。根据树的深度以及左右孩子的顺序来输出,所以就是先进先出的原则,那么我们当然就想到了队列这个数据结构。可以在队尾依次插入左右孩子,在队头依次读取并删除左右孩子,这样就保证了层次的输出。

【java代码实现】

   public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
	    	 ArrayList<Integer> list=new ArrayList<Integer>();
	    	 LinkedList<TreeNode> q=new LinkedList<TreeNode>();
	    	 if(root==null)
	    		 return new ArrayList<Integer>();
	    	 q.add(root);
	    	 while(!q.isEmpty()){//层次遍历
	    		 list.add(q.peek().val);
	    		 TreeNode node=q.removeFirst();//队头node
	    		 if(node.left!=null){
	    			 q.add(node.left);
	    		 }
	    		 if(node.right!=null){
	    			 q.add(node.right);
	    		 }
	    	 }
	    	 return list;
	     }

【入队出队示意】


【3.二叉树构建】数组构建成二叉树递归过程

             /**
	      * 采用递归的方式创建一颗二叉树
	      * 传入的是二叉树的数组表示法
	      * 构造后是二叉树的二叉链表表示法
	      */
	       public static TreeNode makeBinaryTreeByArray(int[] array,int index){
	         if(index<array.length){
	             int value=array[index];
	             if(value!=0){
	                 TreeNode t=new TreeNode(value);
	                 array[index]=0;
	                 t.left=makeBinaryTreeByArray(array,index*2);
	                 t.right=makeBinaryTreeByArray(array,index*2+1);
	                 return t;
	             }
	         }
	         return null;
	     }
 

以上,介绍了二叉树的构建以及深度优先遍历 广度优先遍历过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值