#树先序遍历
#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;
————————————————
版权声明:本文为优快云博主「_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;
}
}
}