zoukankan      html  css  js  c++  java
  • 二叉树的先序、中序、后序、层次遍历的非递归实现及二叉树的翻转递归实现

    参考:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html

    节点定义:
    typedef struct Node{
    	int element;
    	struct Node *left;
    	struct Node *right;
    	struct Node(int data):element(data), left(NULL), right(NULL){}
    } node;
    

      

    先序遍历:
    void preOrder(node *root)
    {
        stack<node *> container;
        node *p = root;
        while(p||!container.empty())
        {        
            while(p)
            {
                cout<<p->element<<" ";
                container.push(p);
                p  = p->left;
            }
            if(!container.empty())
            {
                p = container.top();
                container.pop();
                p = p->right;
            }
        }
    }
    中序遍历:
    
    void inOrder(node *root)
    {
    	stack<node*> container;
    	node *p =root;
    	while(p||!container.empty())
    	{
    		while(p)
    		{
    			container.push(p);
    			p  = p->left;
    		}
    	if(!container.empty())
    		{
    			p = container.top();
    			container.pop();
    			cout<<p->element<<" ";
    			p = p->right;
    	}
    	}
    };
    

      

    后序遍历:
    void postOrder(node *root)
    {
    	stack<node*> container;
    	node *cur=NULL;
    	node *pre = NULL;
    	container.push(root);
    	while(!container.empty())
    	{
    		cur = container.top();
    		if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right)))
    		{
    			cout<< cur->element<<" ";
    			container.pop();
    			pre = cur;
    		}
    		else
    		{
    			if(cur->right!=NULL)
    				container.push(cur->right);
    
    			if(cur->left)
    				container.push(cur->left);
    			
    		}
    	}
    
    }
    

      

    层次遍历:
    void levelOrder(node *root)
    {
        queue<node *>first;
        queue<node *>second;
        node *p = root;
        first.push(p);
        while(!first.empty()||!second.empty())
        {
    
            while(!first.empty())
            {
                p = first.front();
                first.pop();
                cout <<p->element<<" ";
                if(p->left)
                    second.push(p->left);
                if(p->right)
                    second.push(p->right);            
            }
            cout<<endl;
            first = second;
            int size = second.size();
            for(int i=0; i<size; i++)
                second.pop();
        }
    }
    二叉树的翻转:
    node* reverseTree(node *p)
    {
    	if(p==NULL)
    		return NULL;
    	node *tmp = reverseTree(p->left);
    	p->left = reverseTree(p->right);
    	p->right = tmp;
    	return p;
    }
    

      

  • 相关阅读:
    App开放接口api安全性—Token签名sign的设计与实现
    查看文件(或文件夹)被哪个进程使用【文件已在另一程序中打开】
    利用递归将数组转码
    h5 定位
    使用OAuth Server PHP实现OAuth2服务
    在Linux上安装jdk,mysql,tomcat的准备工作
    Core Java笔记
    随机森林简介
    Linux 查看操作系统版本
    RNA_seq GATK 最佳实践
  • 原文地址:https://www.cnblogs.com/break-python/p/5316995.html
Copyright © 2011-2022 走看看