zoukankan      html  css  js  c++  java
  • 非递归实现树的遍历

    【代码】

    #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;
    }


  • 相关阅读:
    奶萨的团队框架(Grid)个人设置技巧以及使用方法
    巫妖王之怒:3.35暗牧输出手法入门指引
    WLK3.3.5治疗怎么玩:治疗职业心得汇总
    WLK奥术fs怎么打高DPS
    战斗贼入门级输出循环
    3.35国服法师DPS提升指引 奥与火的双重奏
    3.35奶萨新手无聊看看帖
    邪冰双手(鲜血领域)——新手推荐,AOE和移动战都不错
    WLK 防骑T
    WLK防骑拉怪手法(要有序排列再给我答案)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5169524.html
Copyright © 2011-2022 走看看