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


  • 相关阅读:
    hdu 1269(tarjan)
    hdu 1281(二分图最大匹配+枚举)
    CodeSmith学习笔记
    记录一个JQUERY模仿序列号输入
    jQuery Tips(5)关于伪类选择符
    PowerDesigner设置Table的默认属性值(字体颜色,大小,主键颜色等)
    使用UpdatePanel时触发JS的方法
    在C#中使用owc11 画折线图 .
    邮件发送错误解决一例
    ASP.NET下载远程图片保存到本地的方法、保存抓取远程图片
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5169524.html
Copyright © 2011-2022 走看看