程序员代码面试指南第二版 32.分别用递归和非递归方式实现二叉树先序、中序和后序遍历
题目描述
分别按照二叉树先序,中序和后序打印所有的节点。
输入描述:
第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。
以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)
输出描述:
输出三行,分别表示二叉树的先序,中序和后序。
示例1
输入
3 1
1 2 3
2 0 0
3 0 0
输出
1 2 3
2 1 3
2 3 1
第一次做; 必须掌握的基础; 注意如果建立树; 超时,通过75%
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] str = sc.nextLine().split(" ");
int n = Integer.parseInt(str[0]);
int rootVal = Integer.parseInt(str[1]);
TreeNode[] nodes = new TreeNode[n+1];
for(int i=1; i<=n; i++){
nodes[i] = new TreeNode(i);
}
for(int i=0; i<n; i++){
str = sc.nextLine().split(" ");
int cur = Integer.parseInt(str[0]);
int left = Integer.parseInt(str[1]);
int right = Integer.parseInt(str[2]);
nodes[cur].left = left==0?null:nodes[left];
nodes[cur].right = right==0?null:nodes[right];
}
TreeNode root = nodes[rootVal];
preOrder(root);
inOrder(root);
posOrder2(root);
}
public static void preOrder(TreeNode root){
if(root==null)
return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
System.out.print(node.val+" ");
if(node.right!=null)
stack.push(node.right);
if(node.left!=null)
stack.push(node.left);
}
System.out.println();
}
public static void inOrder(TreeNode root){
if(root==null)
return;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur!=null){
if(cur!=null){
stack.push(cur);
cur = cur.left;
}
else{
TreeNode node = stack.pop();
System.out.print(node.val+" ");
cur = node.right;
}
}
System.out.println();
}
public static void posOrder1(TreeNode root){
if(root==null)
return;
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(root);
while(!stack1.isEmpty()){
TreeNode node = stack1.pop();
if(node.left!=null)
stack1.push(node.left);
if(node.right!=null)
stack1.push(node.right);
stack2.push(node);
}
while(!stack2.isEmpty()){
System.out.print(stack2.pop().val+" ");
}
System.out.println();
}
public static void posOrder2(TreeNode root){
if(root==null)
return;
TreeNode c=null, h=root;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
c = stack.peek();
if(c.left!=null && h!=c.left && h!=c.right)
stack.push(c.left);
else if(c.right!=null && h!=c.right)
stack.push(c.right);
else{
System.out.print(stack.pop().val+" ");
h = c;
}
}
System.out.println();
}
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
}
}