树的深度优先与广度优先遍历

原题出自百度的笔试:

简述树的深度优先及广度优先遍历算法,并说明非递归实现。
 

当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构:

深度优先遍历--->栈;

广度优先遍历--->队列;

这里以二叉树为例来实现。

    import java.util.ArrayDeque;  
      
    public class BinaryTree {  
        static class TreeNode{  
            int value;  
            TreeNode left;  
            TreeNode right;  
              
            public TreeNode(int value){  
                this.value=value;  
            }  
        }  
          
        TreeNode root;  
          
        public BinaryTree(int[] array){  
            root=makeBinaryTreeByArray(array,1);  
        }  
      
        /** 
         * 采用递归的方式创建一颗二叉树 
         * 传入的是二叉树的数组表示法 
         * 构造后是二叉树的二叉链表表示法 
         */  
        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;  
        }  
          
        /** 
         * 深度优先遍历,相当于先根遍历 
         * 采用非递归实现 
         * 需要辅助数据结构:栈 
         */  
        public void depthOrderTraversal(){  
            if(root==null){  
                System.out.println("empty tree");  
                return;  
            }         
            ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();  
            stack.push(root);         
            while(stack.isEmpty()==false){  
                TreeNode node=stack.pop();  
                System.out.print(node.value+"    ");  
                if(node.right!=null){  
                    stack.push(node.right);  
                }  
                if(node.left!=null){  
                    stack.push(node.left);  
                }             
            }  
            System.out.print("\n");  
        }  
      
        /** 
         * 广度优先遍历 
         * 采用非递归实现 
         * 需要辅助数据结构:队列 
         */  
        public void levelOrderTraversal(){  
            if(root==null){  
                System.out.println("empty tree");  
                return;  
            }  
            ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();  
            queue.add(root);  
            while(queue.isEmpty()==false){  
                TreeNode node=queue.remove();  
                System.out.print(node.value+"    ");  
                if(node.left!=null){  
                    queue.add(node.left);  
                }  
                if(node.right!=null){  
                    queue.add(node.right);  
                }  
            }  
            System.out.print("\n");  
        }  
          
        /**  
         *                  13 
         *                 /  \ 
         *               65    5 
         *              /  \    \ 
         *             97  25   37 
         *            /    /\   / 
         *           22   4 28 32 
         */  
        public static void main(String[] args) {  
            int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};  
            BinaryTree tree=new BinaryTree(arr);  
            tree.depthOrderTraversal();  
            tree.levelOrderTraversal();  
        }  
    }  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值