中序遍歷非遞迴演算法
阿新 • • 發佈:2019-01-23
中序遍歷:
方法一:
//中序遍歷 void InOrderWithoutRecursion1(BTNode* root) { //空樹 if (root == NULL) return; //樹非空 BTNode* p = root; stack<btnode*> s; while (!s.empty() || p) { //一直遍歷到左子樹最下邊,邊遍歷邊儲存根節點到棧中 while (p) { s.push(p); p = p->lchild; } //當p為空時,說明已經到達左子樹最下邊,這時需要出棧了 if (!s.empty()) { p = s.top(); s.pop(); cout << setw(4) << p->data; //進入右子樹,開始新的一輪左子樹遍歷(這是遞迴的自我實現) p = p->rchild; } } }</btnode*>
方法二:
//中序遍歷 void InOrderWithoutRecursion2(BTNode* root) { //空樹 if (root == NULL) return; //樹非空 BTNode* p = root; stack<btnode*> s; while (!s.empty() || p) { if (p) { s.push(p); p = p->lchild; } else { p = s.top(); s.pop(); cout << setw(4) << p->data; p = p->rchild; } } }</btnode*>
方法三:
public void InOrderWithoutRecursion(TreeNode T){ Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p; while(T!=null||!stack.empty()){ while(T!=null){ //將結點壓進棧中 stack.push(T); T = T.lchild; } if(!stack.empty()){ //將棧中的結點彈出 p = stack.peek(); stack.pop(); System.out.println(p.data); T = p.rchild; } } }