二叉树的广度遍历算法

来源:互联网 发布:玉田二中网络优盘 编辑:程序博客网 时间:2024/05/22 07:07

为这个题已经想了几天了,可能存在惯性思维的障碍所以一直想从递归的方式去处理,但是这个情况不太一样,用递归实在是很难找到思路,后来又转变思路,每层添加的节点放到集合里,然后去遍历集合打印左右子树然后又把子树添加到一个新集合里,这样直到打印到新建的集合没有节点为止。这里还可以继续优化,也是就放每层节点的集合每次打印完可以清空下一层继续用,不用去再生成集合。
以下我功能的实现。

public class PrintTree {    //主函数测试    public static void main(String args[])    {        TreeNode root = new TreeNode(1);        root.left = new TreeNode(2);        root.right = new TreeNode(3);        root.left.left = new TreeNode(4);        root.right.right = new TreeNode(5);        ArrayList<Integer> list = PrintFromTopToBottom(root);        //打印出广度遍历        for(int i : list)        {            System.out.println(i);        }    }    /*     * 从上到下打印二叉树,广度遍历     */    /*     * 思路就是每次添加左右子树,然后保存在第二个列表里,然后再去遍历这个内层节点的左右值     */     public static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {         //如果二叉树为空         if(root == null)         {             //返回一个空的列表             return new ArrayList<Integer>();         }         else         {             //初始化列表             ArrayList<Integer> list = new ArrayList<Integer>();             TreeNode p = root;//定义指针             //添加该引用节点的值             list.add(p.val);             while(p.left != null || p.right != null)             {                 //定义一个存放所有同层节点的列表                 ArrayList<TreeNode> list2 = new ArrayList<TreeNode>();                 if(p.left != null)                 {                     list.add(p.left.val);                     list2.add(p.left);                 }                 if(p.right != null)                 {                     list.add(p.right.val);                     list2.add(p.right);                 }                 //p2指向下一层的从左到右的第一个节点                 TreeNode p2 = null;                 for(TreeNode treeNode : list2)                 {                     if(treeNode.left != null)                     {                         list.add(treeNode.left.val);                         if(p2 == null)                         {                             p2 = treeNode.left;                         }                     }                     if(treeNode.right != null)                     {                         list.add(treeNode.right.val);                         if(p2 == null)                         {                             p2 = treeNode.right;                         }                     }                 }                 //p指向下一层的第一个节点                 p = p2;            }             return list;         }        }}//定义个二叉树class TreeNode{    int val;    TreeNode left;    TreeNode right;    TreeNode(int val)    {        this.val = val;    }    }
0 0
原创粉丝点击