【C++】 ——三種方法寫二叉樹的後序遍歷(遞歸+非遞歸)

三種方法寫二叉樹的後序遍歷(遞歸+非遞歸)

思路一(遞歸):後序遍歷:根、左、右。採用棧進行存儲,遞歸的返回條件是root==NULL;相信大家都見到過這種寫法,代碼如下:

class Solution 
{
public:    
	void postOrder(TreeNode *root,vector<int>&vec)
	{        
		if(root != NULL)
		{            
			postOrder(root->left,vec);            
			postOrder(root->right,vec);            		
			vec.push_back(root->val);        
		}    
	}    
	vector<int> postorderTraversal(TreeNode *root) 
	{        
			vector<int>vec;        
			postOrder(root,vec);        
			return vec;                    
	}
};

思路二(非遞歸):因爲我們知道先序遍歷的順序是“根、左、右”,我們可以先變成“跟、右、左”然後再利用reverse函數。代碼如下:

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
	/**
	 *
	 * @param root TreeNode類
	 * @return int整型vector
	 */
	vector<int> postorderTraversal(TreeNode* root)
	{
		// write code here
		vector<int> v;
		if (!root)
			return v;
		stack<TreeNode*> res;
		res.push(root);
		while (res.size())
		{
			TreeNode* tmp = res.top();
			res.pop();
			v.push_back(tmp->val);
			if (tmp->left)
				res.push(tmp->left);
			if (tmp->right)
				res.push(tmp->right);
		}
		reverse(v.begin(), v.end());
		return v;
	}
};

思路三(非遞歸):我們也是要利用棧進行存儲節點,如果當前節點的左右都爲空,說明他就是葉子結點,把它節點的值存儲下來。如果右爲空左不爲空,那就把右壓入棧,如果左不爲空,右爲空,則把左壓入棧。代碼如下:

class Solution {
public:
	/**
	 *
	 * @param root TreeNode類
	 * @return int整型vector
	 */
	vector<int> postorderTraversal(TreeNode* root)
	{
		vector<int> v;
		if (!root)
			return v;
		stack<TreeNode*> s;
		TreeNode* tmp = NULL;
		s.push(root);
		while (s.size())
		{
			tmp = s.top();
			if (tmp->left == NULL && tmp->right == NULL)
			{
				v.push_back(tmp->val);
				s.pop();
			}
			else
			{
				if (tmp->right != NULL)
				{
					s.push(tmp->right);
					tmp->right = NULL;
				}
				if (tmp->left != NULL)
				{
					s.push(tmp->left);
					tmp->left = NULL;
				}
			}
		}
		return v;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章