前言:
在 Tree algorithm 中的 Inorder traversal 一般是使用 recursive 的方法完成. 假設我們有定義一個 Node 的 class:
- package ref;
- public class Node
extends Comparablesuper E>> { - public Node
left = null; - public Node
right = null; - public E data;
- public Node(E data){this.data = data;}
- }
而該 Tree 的 inorder traversal 應該是: 4->2->5->1->3. 建立該 Tree 的代碼如下:
- public static Node
GenTree1() - {
- Node
root = new Node ( 1); - root.left = new Node
( 2); - root.right = new Node
( 3); - root.left.left = new Node
( 4); - root.left.right = new Node
( 5); - return root;
- }
- public static void InorderRecur(Node
node) - {
- if(node!=null)
- {
- InorderRecur(node.left); // Left
- System.out.printf("%s ", node.data); // Visit
- InorderRecur(node.right); // Right
- }
- }
Inorder Tree Traversal without Recursion:
首先我們知道 Stack 是 LIFO 的 ADT, 接著我們要利用這個特性來設計 algorithm 進行 Tree 的 inorder traversal. 因為 Inorder traversal 是 LVR (Left->Visit->Right), 所以一開始要走到 Tree 的最左邊的 node, 而走的過程中需要把走過的 node 記起來方便後續取出, 因為最後走過的 node 要先拿出來, 故我們採用 Stack 來存放. 整個演算法過程如下:
而上面演算法的實作代碼如下:
- public static void Inorder(Node
node) - {
- Stack
> stack = new Stack >(); - Node
curNode = node; - while(curNode!=null || !stack.isEmpty())
- {
- while(curNode!=null)
- {
- stack.push(curNode);
- curNode = curNode.left;
- }
- curNode = stack.pop();
- System.out.printf("%s ", curNode.data);
- curNode = curNode.right;
- }
- }
- public static void main(String args[])
- {
- Node
root = GenTree1(); - Inorder(root);
- }
Supplement:
* [ 資料結構 小學堂 ] 樹狀結構導論 : 二元樹的走訪
沒有留言:
張貼留言