中序遍历:
方法一:
//中序遍历 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; } } }