前序、中序、后序遍历(非递归方法)

递归方法:

//先序遍历
void PreOrder(BiTree T){
	if(T!=NULL){
		cout<<T->data<<" ";
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
} 
//中序遍历
void InOrder(BiTree T){
	if(T!=NULL){
		PreOrder(T->lchild);
		cout<<T->data<<" ";
		PreOrder(T->rchild);
	}
}
//后序遍历
void AfterOrder(BiTree T){
	if(T!=NULL){
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		cout<<T->data<<" ";
	}
}

非递归方法:

//非递归调用的先序遍历
void  PreOrderTree(BiTree T){
	stack<BiNode *> s;
	while(T||!s.empty()){
		while(T){
			cout<<T->data;
			s.push(T);
			T=T->lchild;
		}
		if(!s.empty()){
			T=s.top();
			s.pop();
			T=T->rchild;
		}
	}
	cout<<endl;
}
//非递归调用的中序遍历
void  InOrderTree(BiTree T){
	stack<BiNode *> s;
	while(T||!s.empty()){
		while(T){
			s.push(T);
			T=T->lchild;
		}
		if(!s.empty()){
			T=s.top();
			s.pop();
			cout<<T->data;
			T=T->rchild;
		}
	}
	cout<<endl;
}

//非递归调用的后序遍历
void AfterOrderTree(BiTree T){
	stack<BiNode*> s;
	BiNode* lastVisited = NULL; // 记录上一个访问过的结点
	while (T || !s.empty()) {
		while (T) {
			s.push(T);
			T = T->lchild;
		}
		if (!s.empty()) {
			BiNode* topNode = s.top();
			if (topNode->rchild && topNode->rchild != lastVisited) {
				T = topNode->rchild;
			} else {
				cout << topNode->data;
				lastVisited = topNode;
				s.pop();
			}
		}
	}
	cout << endl;
}

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-24 20:36:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-24 20:36:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-24 20:36:05       82 阅读
  4. Python语言-面向对象

    2024-03-24 20:36:05       91 阅读

热门阅读

  1. 数独游戏(c++题解)

    2024-03-24 20:36:05       43 阅读
  2. 白学的小知识[js.事件]

    2024-03-24 20:36:05       42 阅读
  3. sql中如何添加数据

    2024-03-24 20:36:05       46 阅读
  4. Python:多态

    2024-03-24 20:36:05       42 阅读