6.2非递归遍历
class Solution {//前序
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* bt;
bt = st.top();
st.pop();
result.push_back(bt->val);
if(bt->left) st.push(bt->left);
if(bt->right) st.push(bt->right);
}
//后序遍历只要翻转
//reverse(result.begin(),result.end());
return result;
}
};
//中序非递归
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* bt = root;
while(bt||!st.empty()){
if(bt){
st.push(bt);
bt = bt -> left;
}
else{
bt = st.top();
st.pop();
result.push_back(bt->val);
bt = bt -> right;
}
}
return result;
}
};
6.3二叉树的层次遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
if(root) que.push(root);//先将根结点放入队列
while(!que.empty()){
int size = que.size();
TreeNode* bt;
vector<int> vec;
for(int i=0;i<size;i++){//上一个while入了几个左右孩子结点就循环几次
bt = que.front();
que.pop();
vec.push_back(bt->val);
if(bt->left) que.push(bt->left);
if(bt->right) que.push(bt->right);
}
result.push_back(vec);
}
return result;
}
};
6.4翻转二叉树
class Solution {//先序遍历
public:
TreeNode* invertTree(TreeNode* root) {
TreeNode* bt = root;
if(!bt) return NULL;
else{
swap(bt->left,bt->right);
invertTree(bt->left);
invertTree(bt->right);
return bt;
}
}
};
6.5对称二叉树
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right){
if(left&&!right) return false;//左节点存在但是右节点不存在
else if(!left&&right) return false;
else if(!left&&!right) return true;//左右结点都不存在
else if(left->val!=right->val) return false;//左右结点都存在但是其值不同
bool isname;
bool outside = compare(left->left,right->right);//外侧结点相比
bool inside = compare(left->right,right->left);//内测结点相比
return isname = outside&&inside;
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return compare(root->left,root->right);
}
};