• 二叉树的遍历算法


    二叉树的先序、中序、后序以及层次遍历算法

    非递归版本:

    vector<int> postorderTraversal(TreeNode *root){
    	vector<int> vect;
    	if (!root)
    	{
    		return vect;
    	}
    	stack<TreeNode*> stackData;
    	stackData.push(root);
    	TreeNode* cur = NULL;
    	TreeNode* pre = NULL;
    	while (!stackData.empty())
    	{
    		cur=stackData.top();
    		if (cur->left==NULL&&cur->right==NULL || (pre!=NULL)&&(pre==cur->left||pre==cur->right))
    		{
    			vect.push_back(cur->val);
    			pre=cur;
    			stackData.pop();
    		}else{
    			if (cur->right)
    			{
    				stackData.push(cur->right);
    			}
    
    			if (cur->left)
    			{
    				stackData.push(cur->left);
    			}
    		}
    	}
    	return vect;
    }
    
    
    vector<int> preordertTraversal(TreeNode *root){
    	
    	vector<int> vect;
    	
    	if (!root)
    	{
    		return vect;
    	}
    	stack<TreeNode*> stackData;
    	TreeNode *pNode = root;
    	while (pNode||!stackData.empty())
    	{
    		while (pNode)
    		{
    			vect.push_back(pNode->val);
    			stackData.push(pNode);
    			pNode=pNode->left;
    		}
    
    		if (!stackData.empty())
    		{
    			pNode=stackData.top();
    			stackData.pop();
    			pNode=pNode->right;
    		}
    	}
    
    	return vect;
    }
    
    vector<int> inorderTraversal(TreeNode *root){
    	vector<int> inorder;
    	stack<TreeNode*> stackData;
    	TreeNode *pNode=root;
    	while(pNode||!stackData.empty()){
    		while(pNode){
    			stackData.push(pNode);
    			pNode=pNode->left;
    		}
    
    		if(!stackData.empty()){
    			pNode=stackData.top();
    			inorder.push_back(pNode->val);
    			stackData.pop();
    			pNode = pNode->right;
    		}
    
    	}
    	return inorder;
    }
    
    vector<vector<int> > levelOrderBottom(TreeNode *root){
    	vector<vector<int> > result;
    	if (!root)
    	{
    		return result;
    	}
    	vector<int> curlevel;
    	queue<TreeNode*> q;
    	q.push(root);
    	q.push(NULL);
    	while (!q.empty())
    	{
    		TreeNode * node = q.front();
    		q.pop();
    
    		if(node)
    		{
    			curlevel.push_back(node->val);
    			if (node->left)
    			{
    				q.push(node->left);
    			}
    			if (node->right)
    			{
    				q.push(node->right);
    			}
    		}else {
    			result.push_back(curlevel);
    			curlevel.clear();
    			if(!q.empty())  //该处相当关键 否则会出现死循环
    				q.push(NULL);
    		}
    	}
    	reverse(result.begin(),result.end());
    	return result;  
    }
    

      

  • 相关阅读:
    Unity模型导入导出
    3D知识补充
    Unity. Navigation和寻路
    Unity坐标系
    Unity材质
    Unity摄像机
    Unity光照
    Unity资源管理与更新
    Unity垃圾回收
    intellij idea 的全局搜索快捷键方法
  • 原文地址:https://www.cnblogs.com/liwenzhu/p/4000896.html
Copyright © 2020-2023  润新知