首页 > 代码库 > 非递归实现树的遍历
非递归实现树的遍历
【代码】
#include <iostream> #include <stack> using namespace std; typedef struct Node{ char key; struct Node *lchild, *rchild; }*Tree, TNode; void PreOrder(Tree T) //先序遍历 { if (T == NULL) return; TNode *curr = T; //TNode *tmp; stack<Tree> s; while (curr != NULL || !s.empty()) { if (curr != NULL) { cout<<curr->key; s.push(curr); curr = curr->lchild; } else { curr = s.top(); s.pop(); curr = curr->rchild; } } /* while (curr != NULL) { cout<<curr->key; s.push(curr); curr = curr->lchild; } while(!s.empty()) { curr = s.top(); s.pop(); tmp = curr->rchild; while(tmp != NULL) { cout<<tmp->key; s.push(tmp); tmp = tmp->lchild; } } */ } void InOrder(Tree T) //中序遍历 { if (T == NULL) return; TNode *curr = T; //TNode *tmp; stack<Tree> s; while ((curr != NULL) || !s.empty()) { if (curr != NULL) { s.push(curr); curr = curr->lchild; } else { curr = s.top(); cout<<curr->key; s.pop(); curr = curr->rchild; } } } void PostOrder(Tree T) //后序遍历 { if (T == NULL) return ; TNode *curr = T, *pre = NULL; stack<Tree> s; while (curr != NULL || !s.empty()) { if (curr != NULL) { s.push(curr); curr = curr->lchild; } else { curr = s.top(); s.pop(); if (curr->rchild != NULL && curr->rchild != pre) { s.push(curr); curr = curr->rchild; } else { cout<<curr->key; pre = curr; curr = NULL; } } } } Tree createTree(char *s, int n, int i) //建树 { if (i >= n) return NULL; TNode *curr; curr = (TNode *)malloc(sizeof(TNode)); curr->key = s[i]; curr->lchild = createTree(s, n, 2*(i+1)-1); curr->rchild = createTree(s, n, 2*(i+1)); return curr; } void freeTree(Tree T) //释放 { if (T != NULL){ freeTree(T->lchild); freeTree(T->rchild); delete T; } } int main(void) { char s[] = "ABCDEFG"; Tree T; T = createTree(s, 7, 0); InOrder(T); cout<<endl; PreOrder(T); cout<<endl; PostOrder(T); cout<<endl; freeTree(T); return 0; }
非递归实现树的遍历
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。