二叉树的广度遍历算法

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

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;
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值