zoukankan      html  css  js  c++  java
  • 每天一道算法题(38)——二叉树的非递归遍历

    #include<iostream>
    #include "stack"
    using namespace std;
    struct node{
    	char c;
    	node* left;
    	node *right;
    	bool flag;
    };
    
    void pre(node* head){//非递归前序遍历
    	stack<node*> s;
    	while (head || !s.empty()){
    		if (head){
    			cout << head->c;
    			s.push(head);
    			head = head->left;
    		}
    		else{
    			head = s.top()->right;
    			s.pop();
    		}
    	}
    }
    void middle(node* head){//非递归中序遍历
    	stack<node*> s;
    	node* p;
    	while (head || !s.empty()){
    		if (head){
    			s.push(head);
    			head = head->left;
    		}
    		else{
    			p = s.top();
    			cout << p->c;
    			s.pop();
    			head = p->right;
    		}
    	}
    }
    
      void post(node* head){//非递归后序遍历
    	node* p;
    	stack<node*> s;
    	while (head || !s.empty()){
    		if (head){
    			s.push(head);
    			head = head->left;
    		}
    		else{
    			p = s.top();
    			if (p->flag){
    				cout << p->c;
    				s.pop();
    			}
    			else{
    				head = p->right;
    				p->flag = true;//代表右子树已经访问过
    			}
    		}
    	}
    }
    int main(int argc, char **argv)
    {
    	node f = { 'f', 0, 0, false };
    	node e = { 'e', &f, 0, false };
    	node d = { 'd', 0, 0, false };
    	node b = { 'b', &d, &e, false };
    	node g = { 'g', 0, 0, false };
    	node c = { 'c', 0, &g, false };
    	node a = { 'a', &b, &c, false };
    	pre(&a);
    	cout << endl;
    	middle(&a);
    	cout << endl;
    	post(&a);
    }

  • 相关阅读:
    随笔:金融的“游戏”规则——游戏世界的区块链喵与现实世界的金融科技
    js实现链表
    事件
    JQ操作DOM
    JQuery选择器
    AJAX
    file
    表单
    DOM
    window&navigator&screen&location
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392963.html
Copyright © 2011-2022 走看看