二叉树遍历(java代码)

来源:互联网 发布:矩阵纵横官网 编辑:程序博客网 时间:2024/06/06 00:37
  1. /** 
  2.  * @author zky
  3.  *  定义二叉树 
  4.  */  
  5. class Node {  
  6.     private char key;  
  7.     private Node left, right;  
  8.   
  9.     public Node(char key) {  
  10.         this(key, nullnull);  
  11.     }  
  12.   
  13.     public Node(char key, Node left, Node right) {  
  14.         this.key = key;  
  15.         this.left = left;  
  16.         this.right = right;  
  17.     }  
  18.   
  19.     public char getKey() {  
  20.         return key;  
  21.     }  
  22.     public void setKey(char key) {  
  23.         this.key = key;  
  24.     }  
  25.   
  26.     public Node getLeft() {  
  27.         return left;  
  28.     }  
  29.     public void setLeft(Node left) {  
  30.         this.left = left;  
  31.     }  
  32.   
  33.     public Node getRight() {  
  34.         return right;  
  35.     }  
  36.     public void setRight(Node right) {  
  37.         this.right = right;  
  38.     }  
  39. }  
  40.   
  41. public class BinaryTree {  
  42.     protected Node root;  
  43.   
  44.     public BinaryTree(Node root) {  
  45.         this.root = root;  
  46.     }  
  47.   
  48.     public Node getRoot() {  
  49.         return root;  
  50.     }  
  51.   
  52.     /** 构造树 */  
  53.     public static Node init() {  
  54.         Node a = new Node('A');  
  55.         Node b = new Node('B'null, a);  
  56.         Node c = new Node('C');  
  57.         Node d = new Node('D', b, c);  
  58.         Node e = new Node('E');  
  59.         Node f = new Node('F', e, null);  
  60.         Node g = new Node('G'null, f);  
  61.         Node h = new Node('H', d, g);  
  62.         return h;// root  
  63.     }  
  64.   
  65.     /** 访问节点 */  
  66.     public static void visit(Node p) {  
  67.         System.out.print(p.getKey() + " ");  
  68.     }  
  69.   
  70.     /** 递归实现前序遍历 */  
  71.     protected static void preorder(Node p) {  
  72.         if (p != null) {  
  73.             visit(p);  
  74.             preorder(p.getLeft());  
  75.             preorder(p.getRight());  
  76.         }  
  77.     }  
  78.   
  79.     /** 递归实现中序遍历 */  
  80.     protected static void inorder(Node p) {  
  81.         if (p != null) {  
  82.             inorder(p.getLeft());  
  83.             visit(p);  
  84.             inorder(p.getRight());  
  85.         }  
  86.     }  
  87.   
  88.     /** 递归实现后序遍历 */  
  89.     protected static void postorder(Node p) {  
  90.         if (p != null) {  
  91.             postorder(p.getLeft());  
  92.             postorder(p.getRight());  
  93.             visit(p);  
  94.         }  
  95.     }  
  96.   
  97.     /** 非递归实现前序遍历 */  
  98.     protected static void iterativePreorder(Node p) {  
  99.         Stack<Node> stack = new Stack<Node>();  
  100.         if (p != null) {  
  101.             stack.push(p);  
  102.             while (!stack.empty()) {  
  103.                 p = stack.pop();  
  104.                 visit(p);  
  105.                 if (p.getRight() != null)  
  106.                     stack.push(p.getRight());  
  107.                 if (p.getLeft() != null)  
  108.                     stack.push(p.getLeft());  
  109.             }  
  110.         }  
  111.     }  
  112.   
  113.     /** 非递归实现前序遍历2 */  
  114.     protected static void iterativePreorder2(Node p) {  
  115.         Stack<Node> stack = new Stack<Node>();  
  116.         Node node = p;  
  117.         while (node != null || stack.size() > 0) {  
  118.             while (node != null) {//压入所有的左节点,压入前访问它  
  119.                 visit(node);  
  120.                 stack.push(node);  
  121.                 node = node.getLeft();  
  122.             }  
  123.             if (stack.size() > 0) {  
  124.                 node = stack.pop();  
  125.                 node = node.getRight();  
  126.             }  
  127.         }  
  128.     }  
  129.   
  130.     /** 非递归实现后序遍历 */  
  131.     protected static void iterativePostorder(Node p) {  
  132.         Node q = p;  
  133.         Stack<Node> stack = new Stack<Node>();  
  134.         while (p != null) {  
  135.             // 左子树入栈  
  136.             for (; p.getLeft() != null; p = p.getLeft())  
  137.                 stack.push(p);  
  138.             // 当前节点无右子或右子已经输出  
  139.             while (p != null && (p.getRight() == null || p.getRight() == q)) {  
  140.                 visit(p);  
  141.                 q = p;// 记录上一个已输出节点  
  142.                 if (stack.empty())  
  143.                     return;  
  144.                 p = stack.pop();  
  145.             }  
  146.             // 处理右子  
  147.             stack.push(p);  
  148.             p = p.getRight();  
  149.         }  
  150.     }  
  151.   
  152.     /** 非递归实现后序遍历 双栈法 */  
  153.     protected static void iterativePostorder2(Node p) {  
  154.         Stack<Node> lstack = new Stack<Node>();  
  155.         Stack<Node> rstack = new Stack<Node>();  
  156.         Node node = p, right;  
  157.         do {  
  158.             while (node != null) {  
  159.                 right = node.getRight();  
  160.                 lstack.push(node);  
  161.                 rstack.push(right);  
  162.                 node = node.getLeft();  
  163.             }  
  164.             node = lstack.pop();  
  165.             right = rstack.pop();  
  166.             if (right == null) {  
  167.                 visit(node);  
  168.             } else {  
  169.                 lstack.push(node);  
  170.                 rstack.push(null);  
  171.             }  
  172.             node = right;  
  173.         } while (lstack.size() > 0 || rstack.size() > 0);  
  174.     }  
  175.   
  176.     /** 非递归实现后序遍历 单栈法*/  
  177.     protected static void iterativePostorder3(Node p) {  
  178.         Stack<Node> stack = new Stack<Node>();  
  179.         Node node = p, prev = p;  
  180.         while (node != null || stack.size() > 0) {  
  181.             while (node != null) {  
  182.                 stack.push(node);  
  183.                 node = node.getLeft();  
  184.             }  
  185.             if (stack.size() > 0) {  
  186.                 Node temp = stack.peek().getRight();  
  187.                 if (temp == null || temp == prev) {  
  188.                     node = stack.pop();  
  189.                     visit(node);  
  190.                     prev = node;  
  191.                     node = null;  
  192.                 } else {  
  193.                     node = temp;  
  194.                 }  
  195.             }  
  196.         }  
  197.     }  
  198.   
  199.     /** 非递归实现后序遍历4 双栈法*/  
  200.     protected static void iterativePostorder4(Node p) {  
  201.         Stack<Node> stack = new Stack<Node>();  
  202.         Stack<Node> temp = new Stack<Node>();  
  203.         Node node = p;  
  204.         while (node != null || stack.size() > 0) {  
  205.             while (node != null) {  
  206.                 temp.push(node);  
  207.                 stack.push(node);  
  208.                 node = node.getRight();  
  209.             }  
  210.             if (stack.size() > 0) {  
  211.                 node = stack.pop();  
  212.                 node = node.getLeft();  
  213.             }  
  214.         }  
  215.         while (temp.size() > 0) {  
  216.             node = temp.pop();  
  217.             visit(node);  
  218.         }  
  219.     }  
  220.   
  221.     /** 非递归实现中序遍历 */  
  222.     protected static void iterativeInorder(Node p) {  
  223.         Stack<Node> stack = new Stack<Node>();  
  224.         while (p != null) {  
  225.             while (p != null) {  
  226.                 if (p.getRight() != null)  
  227.                     stack.push(p.getRight());// 当前节点右子入栈  
  228.                 stack.push(p);// 当前节点入栈  
  229.                 p = p.getLeft();  
  230.             }  
  231.             p = stack.pop();  
  232.             while (!stack.empty() && p.getRight() == null) {  
  233.                 visit(p);  
  234.                 p = stack.pop();  
  235.             }  
  236.             visit(p);  
  237.             if (!stack.empty())  
  238.                 p = stack.pop();  
  239.             else  
  240.                 p = null;  
  241.         }  
  242.     }  
  243.   
  244.     /** 非递归实现中序遍历2 */  
  245.     protected static void iterativeInorder2(Node p) {  
  246.         Stack<Node> stack = new Stack<Node>();  
  247.         Node node = p;  
  248.         while (node != null || stack.size() > 0) {  
  249.             while (node != null) {  
  250.                 stack.push(node);  
  251.                 node = node.getLeft();  
  252.             }  
  253.             if (stack.size() > 0) {  
  254.                 node = stack.pop();  
  255.                 visit(node);  
  256.                 node = node.getRight();  
  257.             }  
  258.         }  
  259.     }  
  260.   
  261.     /** 
  262.      * @param args 
  263.      */  
  264.     public static void main(String[] args) {  
  265.         BinaryTree tree = new BinaryTree(init());  
  266.         System.out.print(" Pre-Order:");  
  267.         preorder(tree.getRoot());  
  268.         System.out.println();  
  269.         System.out.print(" In-Order:");  
  270.         inorder(tree.getRoot());  
  271.         System.out.println();  
  272.         System.out.print("Post-Order:");  
  273.         postorder(tree.getRoot());  
  274.         System.out.println();  
  275.         System.out.print(" Pre-Order:");  
  276.         iterativePreorder(tree.getRoot());  
  277.         System.out.println();  
  278.         System.out.print("Pre-Order2:");  
  279.         iterativePreorder2(tree.getRoot());  
  280.         System.out.println();  
  281.         System.out.print(" In-Order:");  
  282.         iterativeInorder(tree.getRoot());  
  283.         System.out.println();  
  284.         System.out.print(" In-Order2:");  
  285.         iterativeInorder2(tree.getRoot());  
  286.         System.out.println();  
  287.         System.out.print(" Post-Order:");  
  288.         iterativePostorder(tree.getRoot());  
  289.         System.out.println();  
  290.         System.out.print("Post-Order2:");  
  291.         iterativePostorder2(tree.getRoot());  
  292.         System.out.println();  
  293.         System.out.print("Post-Order3:");  
  294.         iterativePostorder3(tree.getRoot());  
  295.         System.out.println();  
  296.         System.out.print("Post-Order4:");  
  297.         iterativePostorder4(tree.getRoot());  
  298.         System.out.println();  
  299.     }  
  300. }  
0 0
原创粉丝点击