zoukankan      html  css  js  c++  java
  • 树的非递规遍历

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    struct Node{
    	int val;
    	Node* left;
    	Node* right;
    	Node(int x_) : val(x_), left(NULL), right(NULL){}
    };
    
    void InOrder(Node* root);
    void PostOrder(Node* root);
    void PreOrder(Node* root);
    
    void CreateTree(Node** root)
    {
    	int x;
    	Node *p;
    	if (*root == NULL){
    		cout << "plz input the root value(can't be 0): ";
    		cin >> x;
    		p = new Node(x);
    		(*root) = p;
    	}
    
    	cout << "input " << (*root)->val << "'s lchild(0 to end): ";
    	if (cin >> x && x != 0){
    		p = new Node(x);
    		(*root)->left = p;
    	}
    	cout << "input " << (*root)->val << "'s rchild(0 to end): ";
    	if (cin >> x && x != 0){
    		p = new Node(x);
    		(*root)->right = p;
    	}
    	if ((*root)->left)
    		CreateTree(&((*root)->left));
    	if ((*root)->right)
    		CreateTree(&((*root)->right));
    }
    
    
    int main()
    {
    	Node *root = NULL;
    	CreateTree(&root);
    	cout << "InOrder..." << endl;
    	InOrder(root);
    	cout << "
    PreOrder..." << endl;
    	PreOrder(root);
    	cout << "
    PostOrder..." << endl;
    	PostOrder(root);
    	return 0;
    }
    
    
    void InOrder(Node *root)
    {//为嘛我觉得这个很不好理解呢?
    	if (root == NULL) return;
    
    	stack<Node*> s;
    	Node *p = root;
    
    	while (p != NULL || !s.empty()){
    		while (p != NULL){
    			s.push(p);
    			p = p->left;
    		}
    		if (!s.empty()){
    			p = s.top();
    			cout << p->val << " ";
    			s.pop();
    			p = p->right;
    		}
    	}
    		
    }
    
    void PostOrder(Node* root)
    {
    	Node *p = root;
    	stack<Node*> s;
    	Node *visited;
    	
    	s.push(p);
    	while (!s.empty()){
    		p = s.top();
    		if ((p->left == NULL && p->right == NULL) || p->left == visited || p->right == visited){
    			cout << p->val << " ";
    			visited = p;
    			s.pop();
    		}else {
    			if (p->right && p->right != visited)
    				s.push(p->right);
    			if (p->left && p->left != visited)
    				s.push(p->left);
    		}
    	}
    }
    
    void PreOrder(Node* root)
    {
    	if (root == NULL) return;
    	stack<Node*> s;
    	Node* p = root;
    
    	while (p != NULL){
    		cout << p->val << " ";
    		if (p->right) s.push(p->right);
    		if (p->left)
    			p = p->left;
    		else if (!s.empty()){
    			p = s.top();
    			s.pop();
    		}else 
    			return;
    	}
    }
    
  • 相关阅读:
    Python 3.8六大新功能
    不小心删除/etc/passwd文件怎么办
    python干货三例(需基础) ​​​​
    程序员喜爱的七款热门Linux系统介绍(附下载地址)
    零代码时代即将到来?没那么简单
    来说说成功的云迁移的10个经验教训
    日本已开始提供10Gbps万兆光纤接入服务
    微软:将向安卓和苹果iOS平台推出杀毒软件Defender
    有jQuery背景,该如何用AngularJS编程思想?
    自用迷你版的Deferred
  • 原文地址:https://www.cnblogs.com/shamoof/p/4727175.html
Copyright © 2011-2022 走看看