1.题目:牛客网 NC45 (实现二叉树先序,中序和后序遍历)
描述
分别按照二叉树先序,中序和后序打印所有的节点。
示例1
输入:
{
1,2,3}
返回值:
[[1,2,3],[2,1,3],[2,3,1]]
2.二叉树的遍历
a.先序遍历:
如果二叉树为空,什么也不做。否则:
1)访问根节点
2)先序遍历左子树
3)先序遍历右子树
b.中序遍历:
如果二叉树为空,什么也不做。否则:
1)中序遍历左子树
2)访问根节点
3)中序遍历右子树
c.后序遍历:
如果二叉树为空,什么也不做。否则:
1)后序遍历左子树
2)后序遍历右子树
3)访问根节点
很明显,先中后序遍历都可以很方便地用递归实现。
3.代码实现
/**
* 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) {
// write code here
vector<int> xianxu;
vector<int> zhongxu;
vector<int> houxu;
//二叉树先序遍历
vector<vector<int> > res;
res.push_back(PreOrder(root,xianxu));
res.push_back(InOrder(root,zhongxu));
res.push_back(PostOrder(root,houxu));
return res;
}
vector<int> PreOrder(TreeNode* root,vector<int> &xianxu)
{
//vector<int> xianxu;
if(root!=NULL)
{
xianxu.push_back(root->val);
PreOrder(root->left,xianxu);
PreOrder(root->right,xianxu);
}
return xianxu;
}
vector<int> InOrder(TreeNode* root,vector<int> &zhongxu)
{
//vector<int> zhongxu;
if(root!=NULL)
{
InOrder(root->left,zhongxu);
zhongxu.push_back(root->val);
InOrder(root->right,zhongxu);
}
return zhongxu;
}
vector<int> PostOrder(TreeNode* root,vector<int> &houxu)
{
//vector<int> houxu;
if(root!=NULL)
{
PostOrder(root->left,houxu);
PostOrder(root->right,houxu);
houxu.push_back(root->val);
}
return houxu;
}
};