题目描述:
分别按照二叉树先序,中序和后序打印所有的节点。
解题分析:
使用递归遍历:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int> > threeOrders(TreeNode* root) {
vector<vector<int>> ans;
vector<int> preOrders;
vector<int> midOrders;
vector<int> postOrders;
orders(root, preOrders, midOrders, postOrders);
ans.push_back(preOrders);
ans.push_back(midOrders);
ans.push_back(postOrders);
return ans;
}
void orders(TreeNode* root, vector<int>& preOrders, vector<int>& midOrders, vector<int>& postOrders){
if(root==NULL)
return;
preOrders.push_back(root->val);
orders(root->left, preOrders, midOrders, postOrders);
midOrders.push_back(root->val);
orders(root->right, preOrders, midOrders, postOrders);
postOrders.push_back(root->val);
return;
}
};
附带循环实现二叉树前、中、后序遍历:
// 迭代函数一(使用了一个栈)
void preOrder(TreeNode* root)
{
if (root != nullptr)
{
stack<TreeNode*> stk1;
stk1.push(root);
while(!stk1.empty())
{
root = stk1.top(); // 用root方便进行表示
pre.push_back(root->val);
stk1.pop();
if (root->right != nullptr)
stk1.push(root->right);
if (root->left != nullptr)
stk1.push(root->left);
}
}
}
// 迭代函数二(使用了一个栈)
void midOrder(TreeNode* root)
{
if (root != nullptr)
{
stack<TreeNode*> stk1;
while(!stk1.empty() || root != nullptr)
{
if (root != nullptr)
{
stk1.push(root);
root = root->left;
}
else
{
root = stk1.top();
in.push_back(root->val);
stk1.pop();
root = root->right;
}
}
}
}
// 迭代函数三(使用了两个栈)
void postOrder(TreeNode* root)
{
if (root != nullptr)
{
stack<TreeNode*> stk1;
stack<TreeNode*> stk2; // 第二个栈起到了反序的作用
stk1.push(root);
while(!stk1.empty())
{
root = stk1.top();
stk2.push(root);
stk1.pop();
if (root->left != nullptr)
stk1.push(root->left);
if (root->right != nullptr)
stk1.push(root->right);
}
while(!stk2.empty())
{
pos.push_back(stk2.top()->val);
stk2.pop();
}
}
}
这篇博客详细介绍了如何使用递归和循环两种方法实现二叉树的前序、中序和后序遍历。递归方案通过三个辅助函数分别完成三种遍历,而循环方案则利用栈来迭代地完成遍历。这些算法对于理解和操作二叉树结构至关重要。
516

被折叠的 条评论
为什么被折叠?



