树先序遍历

#树先序遍历
#1
递归形式不用说
#2
用一个栈每次加入的右左节点,(用队列加入左右节点就是层序便利了)
#3
根据表现写的
根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下:

public static ArrayList preOrder1(TreeNode root){
		Stack<TreeNode> stack = new Stack<TreeNode>();
		ArrayList alist = new ArrayList();
		TreeNode p = root;
		while(p != null || !stack.empty()){
			while(p != null){
				alist.add(p.val);
				stack.push(p);
				p = p.left;
			}
			if(!stack.empty()){
				TreeNode temp = stack.pop();
				p = temp.right;
			}
		}
		return alist;

————————————————
版权声明:本文为CSDN博主「_calm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011514810/article/details/75907170

还可以用两个stack维护状态就像这道题,(但我理解错这道题目了,做的是错的,我理解的是任意路径,不限制开始和结束)
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

if(root==null)return ans;
        int ceng=0;
        TreeNode p=root;
        while(p!=null || ceng>0){
            while(p!=null){
                stack.add(p);
                stack1.add(1);
                ceng++;
                p=p.left;
            }
            if(ceng>0){
                if(stack1.get(ceng-1)==1){
                    stack1.set(ceng-1,2);
                    p=stack.get(ceng-1);
                    p=p.right;
                }else if(stack1.get(ceng-1)==2){
                    int summ=0;
                    int j=ceng-1;
                    for(;j>=0;j--){
                        summ=summ+stack.get(j).val;
                        if(summ>=target)break;
                    }
                    if(summ==target){
                        ArrayList<Integer> res=new ArrayList<Integer>();
                        for(;j<ceng;j++){
                            res.add(stack.get(j).val);
                        }
                        ans.add(res);
                    }
                    while(ceng>0&&stack1.get(ceng-1)==2){
                        stack.remove(ceng-1);
                        stack1.remove(ceng-1);
                        ceng--;
                    }
                    if(ceng>0){
                        stack1.set(ceng-1,2);
                        p=stack.get(ceng-1);
                        p=p.right;
                    }
                }
            }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值