zoukankan      html  css  js  c++  java
  • 二叉树的深度和广度优先遍历

    转载https://blog.csdn.net/cafucwxy/article/details/78447166

    树的深度优先遍历需要用到额外的数据结构—>栈;而广度优先遍历需要队列来辅助;这里以二叉树为例来实现。

    package com.web;
    
    import java.util.ArrayDeque;
    import java.util.Stack;
    
    public class TreeTest {
           static class TreeNode{
                int value;
                TreeNode left;
                TreeNode right;
                public TreeNode(int value){
                    this.value=value;
                }
            }
            TreeNode root;
            public TreeTest(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<TreeNode> stack = new Stack();   //也可以用栈实现
                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("
    ");
            }
    
            /**
             * 广度优先遍历
             * 采用非递归实现
             * 需要辅助数据结构:队列
             */
            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("
    ");
            }
    
            /** 
             *                  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};
                TreeTest tree=new TreeTest(arr);
                tree.depthOrderTraversal();
                tree.levelOrderTraversal();
            }
        
    }
  • 相关阅读:
    获取浏览器类型和版本
    js 防抖、节流
    判断数据类型
    一个函数判断数据类型
    面试题3道
    如何处理循环的异步操作
    this的原理以及几种使用场景
    v-model原理解析
    小程序setData数据量过大时候会对渲染有影响吗?
    js中in关键字的使用方法
  • 原文地址:https://www.cnblogs.com/start-fxw/p/9518589.html
Copyright © 2011-2022 走看看