NC45:实现二叉树先序,中序和后序遍历
实现二叉树先序,中序和后序遍历
http://www.nowcoder.com/questionTerminal/a9fec6c46a684ad5a3abd4e365a9d362
题解
List<Integer> pre = new ArrayList<>(); List<Integer> in = new ArrayList<>(); List<Integer> post = new ArrayList<>(); public int[][] threeOrders (TreeNode root) { // write code here if (root == null) return new int[][] {{}}; List<List<Integer>> ans = new ArrayList<>(); preOrder(root); inOrder(root); postOrder(root); ans.add(pre); ans.add(in); ans.add(post); int[][] res = new int[ans.size()][ans.get(0).size()]; for (int i = 0; i < ans.size(); i++) { for (int j = 0; j < ans.get(0).size(); j++) { res[i][j] = ans.get(i).get(j); } } return res; } private void preOrder(TreeNode root) { if (root == null) return; pre.add(root.val); preOrder(root.left); preOrder(root.right); } private void inOrder(TreeNode root) { if (root == null) return; inOrder(root.left); in.add(root.val); inOrder(root.right); } private void postOrder(TreeNode root) { if (root == null) return; postOrder(root.left); postOrder(root.right); post.add(root.val); }
参考知识
二叉树遍历:递归方法:
public static class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } // 递归版先中后序遍历 public static void preOrderRecur(Node head){ if(head==null){ return; } System.out.print(head.value+" "); preOrderRecur(head.left); preOrderRecur(head.right); } public static void inOrderRecur(Node head){ if(head==null){ inOrderRecur(head.left); System.out.print(head.value+" "); inOrderRecur(head.right); } } public static void posOrderRecur(Node head){ if(head==null){ return; } posOrderRecur(head.left); posOrderRecur(head.right); System.out.print(head.value+" "); }
二叉树遍历:非递归方法:
/* * 先序遍历 * 往栈中压入根结点 * 弹出栈中一个结点并打印 * 压入刚弹出结点的右结点和左结点 * 弹出栈中一个结点并打印 */ public static void preOrderUnRecur(Node head){ System.out.print("preOrder: "); if(head!=null){ Stack<Node> stack=new Stack<Node>(); stack.add(head); //往栈中压入根结点 while(!stack.isEmpty()){ head=stack.pop(); //弹出栈中一个结点并打印,复用了head System.out.print(head.value+" "); if(head.right!=null){ stack.push(head.right); } if(head.left!=null){ stack.push(head.left); } } } System.out.println(); } /* * 中序遍历 * 当前结点不为空时,压入当前结点,当前结点指针向它左结点移动 * 当前结点为空、栈不为空时,弹出栈结点并打印,当前结点指针向栈结点的右结点移动 */ public static void inOrderUnrecur(Node head){ System.out.print("inOrder: "); if(head!=null){ Stack<Node> stack=new Stack<Node>(); while(!stack.isEmpty() || head!=null){ if(head!=null){ stack.push(head); head=head.left; } else{ head=stack.pop(); System.out.print(head.value+" "); head=head.right; } } } System.out.println(); } /* * 后序遍历 * 由前面的先序遍历,中左右,改为中右左,然后放入栈中逆序,得到左右中,即后序遍历 */ public static void posOrderUnRecur(Node head){ System.out.print("posOrder: "); if(head!=null){ Stack<Node> s1=new Stack<Node>(); Stack<Node> s2=new Stack<Node>(); s1.push(head); if(!s1.isEmpty()){ head=s1.pop(); s2.push(head); if(head.left!=null){ s1.push(head.left); } if(head.right!=null){ s1.push(head.right); } } while(!s2.isEmpty()){ System.out.print(s2.pop().value+" "); } } System.out.println(); }
名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解