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

      

  • 相关阅读:
    DM逻辑结构
    DM常见问题
    DM进程与线程
    DM物理存储结构
    systemdlogind.service的RemoveIPC参数影响
    DM内存结构
    DMSQL记录日志跟踪功能
    ACM中java的使用
    Java读取CSV文件为List
    Vue打包优化 优化JS过大 西门
  • 原文地址:https://www.cnblogs.com/break-python/p/5316995.html
Copyright © 2011-2022 走看看