* 非递归实现先序遍历 * 为什么用栈? * 压入的时候从上到下,那么弹出的时候就是从下往上。 * 先压右,再压左,那么弹出的时候会先弹左,再弹右。 */ publicstaticvoidpreOrderUnRecur(Node head){ System.out.print("pre-order: "); if (head != null) { Stack<Node> stack = new Stack<Node>(); stack.add(head); while (!stack.isEmpty()) { head = stack.pop(); System.out.print(head.value + " "); if (head.right != null) { stack.push(head.right); } if (head.left != null) { stack.push(head.left); } } } System.out.println(); }
* 非递归实现中序遍历 * 一压,就压左边一留, * 所以压一留左边界,再依次往外弹,弹到某一个节点再去遍历它右孩子的过程 * 实际上就模拟了左,中,右的过程。 * 整棵树是可以被左边界分解的。 */ publicstaticvoidinOrderUnRecur(Node head){ System.out.print("in-order: "); 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(); }
* 非递归实现后序遍历 * 两个栈实现 * 第一个栈:中右左,打印的时候存到一个栈中去。 * 第二个栈:弹出的时候就是左右中。 */ publicstaticvoidposOrderUnRecur1(Node head){ System.out.print("pos-order: "); if (head != null) { Stack<Node> s1 = new Stack<Node>(); Stack<Node> s2 = new Stack<Node>(); s1.push(head); while (!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(); }
* 只用一个栈实现后序遍历 * geek */ publicstaticvoidposOrderUnRecur2(Node h){ System.out.print("pos-order: "); if (h != null) { Stack<Node> stack = new Stack<Node>(); stack.push(h); Node c = null; while (!stack.isEmpty()) { c = stack.peek(); if (c.left != null && h != c.left && h != c.right) { stack.push(c.left); } elseif (c.right != null && h != c.right) { stack.push(c.right); } else { System.out.print(stack.pop().value + " "); h = c; } } } System.out.println(); }
publicstaticvoidmain(String[] args){ Node head = new Node(5); head.left = new Node(3); head.right = new Node(8); head.left.left = new Node(2); head.left.right = new Node(4); head.left.left.left = new Node(1); head.right.left = new Node(7); head.right.left.left = new Node(6); head.right.right = new Node(10); head.right.right.left = new Node(9); head.right.right.right = new Node(11);
// for test -- print tree publicstaticvoidprintTree(Node head){ System.out.println("Binary Tree:"); printInOrder(head, 0, "H", 17); System.out.println(); }
publicstaticvoidprintInOrder(Node head, int height, String to, int len){ if (head == null) { return; } printInOrder(head.right, height + 1, "v", len); String val = to + head.value + to; int lenM = val.length(); int lenL = (len - lenM) / 2; int lenR = len - lenM - lenL; val = getSpace(lenL) + val + getSpace(lenR); System.out.println(getSpace(height * len) + val); printInOrder(head.left, height + 1, "^", len); }
publicstatic String getSpace(int num){ String space = " "; StringBuffer buf = new StringBuffer(""); for (int i = 0; i < num; i++) { buf.append(space); } return buf.toString(); }
publicstaticvoidmain(String[] args){ Node head = null; printTree(head);
String pre = serialByPre(head); System.out.println("serialize tree by pre-order: " + pre); head = reconByPreString(pre); System.out.print("reconstruct tree by pre-order, "); printTree(head);
String level = serialByLevel(head); System.out.println("serialize tree by level: " + level); head = reconByLevelString(level); System.out.print("reconstruct tree by level, "); printTree(head);
pre = serialByPre(head); System.out.println("serialize tree by pre-order: " + pre); head = reconByPreString(pre); System.out.print("reconstruct tree by pre-order, "); printTree(head);
level = serialByLevel(head); System.out.println("serialize tree by level: " + level); head = reconByLevelString(level); System.out.print("reconstruct tree by level, "); printTree(head);
head = new Node(1); head.left = new Node(2); head.right = new Node(3); head.left.left = new Node(4); head.right.right = new Node(5); printTree(head);
pre = serialByPre(head); System.out.println("serialize tree by pre-order: " + pre); head = reconByPreString(pre); System.out.print("reconstruct tree by pre-order, "); printTree(head);
level = serialByLevel(head); System.out.println("serialize tree by level: " + level); head = reconByLevelString(level); System.out.print("reconstruct tree by level, "); printTree(head);
head = new Node(100); head.left = new Node(21); head.left.left = new Node(37); head.right = new Node(-42); head.right.left = new Node(0); head.right.right = new Node(666); printTree(head);
pre = serialByPre(head); System.out.println("serialize tree by pre-order: " + pre); head = reconByPreString(pre); System.out.print("reconstruct tree by pre-order, "); printTree(head);
level = serialByLevel(head); System.out.println("serialize tree by level: " + level); head = reconByLevelString(level); System.out.print("reconstruct tree by level, "); printTree(head);
publicstaticintgetHeight(Node head, int level, boolean[] res){ if (head == null) { return level; } int lH = getHeight(head.left, level + 1, res); if (!res[0]) { return level; } int rH = getHeight(head.right, level + 1, res); if (!res[0]) { return level; } if (Math.abs(lH - rH) > 1) { res[0] = false; } return Math.max(lH, rH); }
publicstaticvoidmain(String[] args){ Node head = new Node(1); head.left = new Node(2); head.right = new Node(3); head.left.left = new Node(4); head.left.right = new Node(5); head.right.left = new Node(6); head.right.right = new Node(7);
int lastNum = Integer.MIN_VALUE; while(!stack.isEmpty() || head != null){ if(head != null){ stack.push(head); head = head.left; }else{ head = stack.pop(); if(head.value < lastNum){ returnfalse; }else{ lastNum = head.value; } head = head.right; } }
returntrue; }
/** * 所谓的more死什么遍历 * 这个先不用看 */ publicstaticbooleanisBST(Node head){ if (head == null) { returntrue; } boolean res = true; Node pre = null; Node cur1 = head; Node cur2 = null; while (cur1 != null) { cur2 = cur1.left; if (cur2 != null) { while (cur2.right != null && cur2.right != cur1) { cur2 = cur2.right; } if (cur2.right == null) { cur2.right = cur1; cur1 = cur1.left; continue; } else { cur2.right = null; } } if (pre != null && pre.value > cur1.value) { res = false; } pre = cur1; cur1 = cur1.right; } return res; }
publicstaticbooleanisCBT(Node head){ if (head == null) { returntrue; } Queue<Node> queue = new LinkedList<Node>(); boolean leaf = false;//阶段状态:表示是否开启了这个阶段: Node l = null; Node r = null; queue.offer(head); while (!queue.isEmpty()) { head = queue.poll(); l = head.left; r = head.right; if ((leaf && (l != null || r != null))//如果开启了阶段:那么之后的节点都应该是叶子节点。 || (l == null && r != null)) {//第一种情况, returnfalse; } if (l != null) { queue.offer(l); } if (r != null) { queue.offer(r); } else { //右为空,可能有左,也可能没左。 leaf = true; //可以这么写的原因是左孩子为null,右孩子不为null在情况一已经抛弃掉了。 } } returntrue; }
// for test -- print tree publicstaticvoidprintTree(Node head){ System.out.println("Binary Tree:"); printInOrder(head, 0, "H", 17); System.out.println(); }
publicstaticvoidprintInOrder(Node head, int height, String to, int len){ if (head == null) { return; } printInOrder(head.right, height + 1, "v", len); String val = to + head.value + to; int lenM = val.length(); int lenL = (len - lenM) / 2; int lenR = len - lenM - lenL; val = getSpace(lenL) + val + getSpace(lenR); System.out.println(getSpace(height * len) + val); printInOrder(head.left, height + 1, "^", len); }
publicstatic String getSpace(int num){ String space = " "; StringBuffer buf = new StringBuffer(""); for (int i = 0; i < num; i++) { buf.append(space); } return buf.toString(); }
publicstaticvoidmain(String[] args){ Node head = new Node(4); head.left = new Node(2); head.right = new Node(6); head.left.left = new Node(1); head.left.right = new Node(3); head.right.left = new Node(5);
publicstaticvoidmain(String[] args){ Node head = new Node(1); head.left = new Node(2); head.right = new Node(3); head.left.left = new Node(4); head.left.right = new Node(5); head.right.left = new Node(6); System.out.println(nodeNum(head));
近期评论