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

  • 相关阅读:
    [模仿]Google Doodles 的春分和秋分
    [模仿]canvas视频拼图
    SQL--from w3c school
    txt文件导入mysql
    公益图书馆-基本环境搭建及代码规范
    IP地址
    Android基础_1
    Android_输入输出流
    设计模式(2):观察者模式-2 (委托、事件)
    小张日记 一 正式场合说话要正式
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392963.html
Copyright © 2011-2022 走看看