最近几天都没有在leetcode做题了,今天来了做了几个二叉树。发现二叉树的题目真的很多,都是些一般的基础。没有什么说的。找两个最近的题做了贴上吧。
前序遍历二叉树,这个没有什么说的。借助于堆栈可以轻松的实现。题目要求不用递归实现。
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int> vec;
stack<TreeNode *> stk;
if(!root)
return vec;
stk.push(root);
while(stk.size())
{
TreeNode *t=stk.top();
stk.pop();
if(t->right)
stk.push(t->right);
if(t->left)
stk.push(t->left);
vec.push_back(t->val);
}
return vec;
}
};
后序遍历二叉树,题目的要求还是不能使用递归。这都是数据结构的基础知识,也没有什么好说的。我使用的方法是自己开了两个堆栈,因为要记录一个结点是不是第一次出栈。如果是第一次出栈,说明子树没有遍历,将子树进栈。如果是第二次出栈说明子树已经遍历,直接出栈。用一个栈来模拟进栈出栈的过程,记录栈内结点进出栈的情况就可以了。代码也比较好理解。
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int> s;
if(!root)
return s;
stack<TreeNode *> stk;
stack<bool> stk_flag;
stk.push(root);
stk_flag.push(false);//第一次进栈
while(stk.size())
{
TreeNode *t=stk.top();
if(stk_flag.top())
{
s.push_back(t->val);
stk.pop();
stk_flag.pop();
continue;
}
stk_flag.pop();
stk_flag.push(true);//第二次进栈,将flag变为true
if(t->right)
{
stk.push(t->right);
stk_flag.push(false);
}
if(t->left)
{
stk.push(t->left);
stk_flag.push(false);
}
if(!t->left && !t->right)
{
s.push_back(t->val);
stk.pop();
stk_flag.pop();
}
}
return s;
}
};
顺便说下最近的足彩,太坑了。特别是圣日耳曼。害我输了好几次了。哈哈
顺便把中序的也贴一下。思想都比较简单没什么说的。
vector<int> inorderTraversal(TreeNode *root) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
stack<TreeNode *> stk;
vector<int> s;
if(!root)
return s;
while(root)
{
stk.push(root);
root=root->left;
}
while(stk.size())
{
TreeNode *t=stk.top();
stk.pop();
s.push_back(t->val);
if(t->right)
{
TreeNode *p=t->right;
while(p)
{
stk.push(p);
p=p->left;
}
}
}
return s;
}