class Solution {
public:
void travel(TreeNode * cur,vector<int>& vec)
{
if(cur==nullptr)
{
return;
}
travel(cur->left, vec);
travel(cur->right, vec);
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int>ans;
travel(root,ans);
return ans;
}
};
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
TreeNode* cur=root;
while(cur||!st.empty())
{
if(cur)
{
st.push(cur);
cur=cur->left;
}
else{
TreeNode* s=st.top();
st.pop();
ans.push_back(s->val);
cur=s->right;
}
}
return ans;
}
- 统一迭代法在其中插入了NULL,感觉略微麻烦,我还是会用递归法写,迭代法感觉稍微有点没必要
- lc226翻转二叉树
- lc101对称二叉树 lc100相同的树 lc572另一棵树的子树:递归和迭代,递归好想一些,迭代要用一个queue,第一次push两个节点
- lc222完全二叉树的节点数:一直打散为left和right,最后可以转为一个完全二叉树和其他
- lc110平衡二叉树:每个节点的高度(后序遍历)
- lc257二叉树的所有路径:包含了回溯
- lc404左叶子之和:只能通过父节点判定其是不是左叶子
- lc513找树左下角的值
- lc112路径总和 lc113路径总和2
- lc105. 从前序和中序遍历序列构造二叉树 :构造法:前后序切中序(分成左右子树),再切回前后序
- lc106. 从中序和后序遍历序列构造二叉树
- lc654. 最大二叉树
- lc617. 合并二叉树
- lc700. 二叉搜索树中的搜索
二叉搜索树的迭代法
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root != NULL) {
if (root->val > val) root = root->left;
else if (root->val < val) root = root->right;
else return root;
}
return NULL;
}
};
- lc98. 验证二叉搜索树:可以中序遍历,然后只要是增序就行;递归什么的也得中序遍历
- lc530. 二叉搜索树的最小绝对差:中序(可以转为有序数组)
- lc501. 二叉搜索树中的众数
- lc236. 二叉树的最近公共祖先:看答案很吃力,思路比较难理解,睡了一觉才勉强懂了
- lc235. 二叉搜索树的最近公共祖先:从上到下遍历出的第一个满足[x,y]的节点就是
- lc701. 二叉搜索树中的插入操作:正常找,遇到空节点插入
- lc450. 删除二叉搜索树中的节点
- lc669. 修剪二叉搜索树
- lc108. 将有序数组转换为二叉搜索树:每次取中点就行
- lc538. 把二叉搜索树转换为累加树