简单算法 按之字形顺序打印二叉树(java)

简单算法 按之字形顺序打印二叉树(java)
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{1,2,3,#,#,4,5}

该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
想法:找两个栈分别储存奇数偶数层的二叉树结点

代码:

import java.util.ArrayList;
import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        Stack<TreeNode> s1 = new Stack<TreeNode>();
        s1.push(pRoot);//将头结点放入奇数层
        Stack<TreeNode> s2 = new Stack<TreeNode>();
        int flag = 1;//判断在奇数层还是偶数层所用
        while(!s1.empty() || !s2.empty()){
            if(flag % 2 != 0){
                //判断在奇数层
                ArrayList<Integer> a1 = new ArrayList<Integer>();//储存结点上的数
                while(!s1.empty()){//把s1所有结点取出找到下一层结点并放入s2
                    TreeNode t1 = s1.pop();
                    if(t1 != null){
                        a1.add(t1.val);
                    s2.push(t1.left);
                    s2.push(t1.right);
                    }
                }
                if(!a1.isEmpty()){//判断a1是否有值,有值加入list
                    list.add(a1);
                    flag++;
                }
            }else{
                    //判断在偶数层
                ArrayList<Integer> a2 = new ArrayList<Integer>();//储存结点上的数
                while(!s2.empty()){//把s2所有结点取出找到下一层结点并放入s1
                    TreeNode t1 = s2.pop();
                    if(t1 != null){
                    a2.add(t1.val);
                    s1.push(t1.right);//这里顺序变了,因为是之字型遍历
                    s1.push(t1.left);
                    }
                }
                if(!a2.isEmpty()){//判断a2是否有值,有值加入list
                    list.add(a2);
                    flag++;
                }
            }
            }
            return list;
        }
    }

然后我又看见了一个利用LinkList集合可以正反遍历来实现:
思路:利用Java中的LinkedList的底层实现是双向链表的特点。
可用做队列,实现树的层次遍历
可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
   ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
   if (pRoot == null) {
       return ret;
   }
   ArrayList<Integer> list = new ArrayList<>();
   LinkedList<TreeNode> queue = new LinkedList<>();
   queue.addLast(null);//层分隔符
   queue.addLast(pRoot);
   boolean leftToRight = true;
    
   while (queue.size() != 1) {
       TreeNode node = queue.removeFirst();
       if (node == null) {//到达层分隔符
           Iterator<TreeNode> iter = null;
           if (leftToRight) {
               iter = queue.iterator();//从前往后遍历
           } else {
               iter = queue.descendingIterator();//从后往前遍历
           }
           leftToRight = !leftToRight;
           while (iter.hasNext()) {
               TreeNode temp = (TreeNode)iter.next();
               list.add(temp.val);
           }
           ret.add(new ArrayList<Integer>(list));
           list.clear();
           queue.addLast(null);//添加层分隔符
           continue;//一定要continue,到了这里因为是null分隔层所以不必找它是否有左右结点,直接跳过下面代码的这次循环
       }
       if (node.left != null) {
           queue.addLast(node.left);
       }
       if (node.right != null) {
           queue.addLast(node.right);
       }
   }
    
   return ret;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个按前序遍历打印二叉树叶子节点的算法: 1. 如果树为空,返回。 2. 如果节点是叶子节点,打印该节点的值。 3. 递归遍历节点的左子树。 4. 递归遍历节点的右子树。 这个算法会先检查树是否为空,如果是空树则直接返回。如果节点是叶子节点,也就是该节点既没有左子节点也没有右子节点,则打印该节点的值。接着递归遍历节点的左子树和右子树,分别执行步骤2到步骤4,直到遍历完整棵树。 这个算法的时间复杂度是O(n),其中n是树中节点的个数。因为该算法需要遍历整棵树一次,对于每个节点最多执行常数次操作。你好!要按照设计算法的前序遍历顺序打印二叉树的叶子节点,可以使用递归来实现。具体步骤如下: 1. 如果当前节点为空,直接返回。 2. 如果当前节点是叶子节点(即左右子节点都为空),打印该节点的值。 3. 递归遍历当前节点的左子树。 4. 递归遍历当前节点的右子树。 下面是中文的示例代码: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def print_leaves(root): if not root: return if not root.left and not root.right: print(root.val) print_leaves(root.left) print_leaves(root.right) ``` 你可以使用这个函数来打印二叉树的叶子节点。例如,对于下面的二叉树: ``` 1 / \ 2 3 / \ \ 4 5 6 ``` 按照前序遍历顺序,叶子节点的顺序为 4, 5, 6,因此使用上述代码打印输出的结果为: ``` 4 5 6 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值