非递归
先序遍历 头左右
将父节点入栈 每一次
1.从栈中弹出一个节点
2.打印
3.弹出接节点的子节点 先右节点再左节点 如果有的话就入栈
循环
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> result;
if(root==NULL) return result;
s.push(root);
while(!s.empty())
{
TreeNode *temp = s.top();
s.pop();
result.push_back(temp->val);
if(temp->right != NULL)
{
s.push(temp->right);
}
if(temp->left!= NULL)
{
s.push(temp->left);
}
}
return result;
}
};
后序遍历 左右头 相当于先序遍历改(头右左)的逆序
将父节点入栈s1 每一次
1.从栈中弹出一个节点
2.弹出节点压入储备栈s2
3.弹出接节点的子节点 先左节点再右节点 如果有的话就入栈
循环
最后打印储备栈s2
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
stack<int> s2;
vector<int> result;
if(root == NULL) return result;
s.push(root);
while(!s.empty())
{
TreeNode* temp = s.top();
s.pop();
s2.push(temp->val);
if(temp->left)
{
s.push(temp->left);
}
if(temp->right)
{
s.push(temp->right);
}
}
while(!s2.empty())
{
result.push_back(s2.top());
s2.pop();
}
return result;
}
};
中序遍历 左头右
1.将所有的左节点入栈
2.出栈打印
3.如果弹出的节点有右节点就重复1 没有就重复2
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
stack<int> s2;
vector<int> result;
if(root == NULL) return result;
while(!s.empty() || root)
{
if(root)
{
s.push(root);
root = root->left;
}
else
{
result.push_back(s.top()->val);
root = s.top()->right;
s.pop();
}
}
return result;
}
};
宽度优先遍历 使用队列
将头节点入队
1.从队列弹出节点
2.打印
3.弹出接节点的子节点 先左节点再右节点 如果有的话就入队
搜索二叉树 左子树最大值比自己小右子树最小值比自己大
判断方法:中序遍历后是升序
完全二叉树 一棵深度为k的有n个结点的二叉树 ,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与 满二叉树 中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。.
判断方法 宽度优先遍历
1.任意一个有右节点无左节点返回false
2.满足1的情况下 如果遇到一个左右不双全的节点 之后的每一个节点都必须是叶节点
平衡二叉树 每一个子树的左子树与右子树的高度差不超过1