二叉树
题意:给你二叉树的根节点root,返回它节点值的 前序 / 中序 / 后续 遍历。
示例:
思路:本题是学习二叉树必须会的的题,三种遍历方式,我们都可以使用递归,栈等方式进行正确的遍历输出,这里我给出了递归遍历和栈模拟实现的代码
前序遍历递归代码:
vector<int> arr;
vector<int> preorderTraversal(TreeNode* root) {
if(nullptr==root)
{
return arr;
}
arr.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return arr;
}
前序遍历栈模拟实现的代码:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> arr;
s.push(root);
while(!s.empty())
{
TreeNode* cur=s.top();
s.pop();
if(nullptr==cur)//为空时,直接到下一个节点
{
continue;
}
arr.push_back(cur->val);
s.push(cur->right);//需要注意,由于栈的排序是逆序的,因此是右左遍历
s.push(cur->left);
}
return arr;
}
中序遍历递归代码:
vector<int> arr;
vector<int> inorderTraversal(TreeNode* root) {
if(nullptr==root)
{
return arr;
}
inorderTraversal(root->left);
arr.push_back(root->val);
inorderTraversal(root->right);
return arr;
}
中序遍历栈模拟实现的代码:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> arr;
TreeNode* cur=root;
while(nullptr!=cur||!s.empty())
{
if(nullptr!=cur)//当左边有节点时,我们需要一直向左移动
{
s.push(cur);
cur=cur->left;
}
else
{
arr.push_back(s.top()->val);//到底时,我们输出叶子节点,并向右移动
cur=s.top()->right;
s.pop();
}
}
return arr;
}
后序遍历递归代码:
vector<int> arr;
vector<int> postorderTraversal(TreeNode* root) {
if(nullptr==root)
{
return arr;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
arr.push_back(root->val);
return arr;
}
后序遍历栈模拟实现的代码:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> arr;
s.push(root);
while(!s.empty())
{
TreeNode* cur=s.top();
s.pop();
if(nullptr==cur)
{
continue;
}
arr.push_back(cur->val);
s.push(cur->left);//和前序遍历刚好相反,此时获取的就是后序遍历的反向节点
s.push(cur->right);
}
reverse(arr.begin(),arr.end());//反转回正常顺序
return arr;
}