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

来源:互联网 发布:java项目权限管理 编辑:程序博客网 时间:2024/05/16 03:16

原题出自百度的笔试:

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

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

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

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

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

    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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开空调受风了怎么办 胳膊受风了疼怎么办 孩子胳膊抻筋了怎么办 胳膊被风吹了疼怎么办 月子里胳膊受风怎么办 受风了胳膊酸痛怎么办 胳膊受风了在家怎么办 手臂烧伤手肿了怎么办 胳膊里的筋疼怎么办 3岁胳膊背筋了怎么办 左胳膊筋一直疼怎么办 手臂突然筋扭了怎么办 胳膊扭了肿了怎么办 胖人走路磨大腿怎么办 脖子上长了个淋巴结怎么办 面部危险三角区长痘痘怎么办 儿童脖子上有淋巴结节怎么办 左侧颈根部淋巴结肿大怎么办 人的三角区肿了怎么办 刮三角区肿了怎么办 乳腺增生引起的腋窝淋巴结怎么办 右边脸比左边脸大怎么办 六个月宝宝脖子有点歪怎么办 大人的头偏了怎么办 宝宝脖子睡偏了怎么办 宝宝头歪向左边怎么办 一岁宝宝头歪怎么办 宝宝头往右边歪怎么办 八个月宝宝头歪怎么办 宝宝头往左边偏怎么办 11月婴儿歪脖子怎么办 婴儿头往左边偏怎么办 宝宝头网的高怎么办 宝宝头歪向一边怎么办 2岁宝宝头睡偏了怎么办 6岁儿童头有点歪怎么办 宝宝脖子有点偏左边歪怎么办 宝宝脖子偏了怎么办呢 斜颈导致的脸歪怎么办 斜颈手术后脸部还不对称怎么办 宝宝3个月斜颈怎么办