二叉树 Part I
二叉树前序遍历 二叉树中序遍历 二叉树后序遍历
二叉树前序遍历
法1: 递归
/*void traversal(TreeNode* cur,vector<int> &v){
if (cur == NULL)return;
v.push_back(cur->val);
traversal(cur->left,v);
traversal(cur->right,v);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
traversal(root,ans);
return ans;
}*/
法2:迭代
//迭代遍历
vector<int> preorderTraversal(TreeNode* root) {
//借用stack存储/弹出数据
stack<TreeNode*> st;//栈中存储的是TreeNode*
vector<int> ans;
if (root == NULL) return ans;
st.push(root);
while (!st.empty()){
TreeNode* node = st.top(); // 中
ans.push_back(node->val);
st.pop();
if(node->right)st.push(node->right);
if(node->left) st.push(node->left);
// ans[1] =root->left->val;
// ans[2] =root->right->val;
}
return ans;
}
二叉树中序遍历
94. 二叉树的中序遍历
法1:递归
void traversal(TreeNode* cur,vector<int> &v){
if (cur == NULL)return;
//左中右
traversal(cur->left,v);
v.push_back(cur->val);
traversal(cur->right,v);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
traversal(root,ans);
return ans;
}
法2:迭代
vector<int> inorderTraversal(TreeNode* root) {
//迭代遍历 左中右
//在使用迭代法写中序遍历,
//就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
stack<TreeNode*> st;//栈中存储的是TreeNode*
vector<int> ans;
TreeNode* cur = root;
while (cur != NULL || !st.empty()){
if (cur != NULL){//未到达最底层
st.push(cur);
cur =cur->left;
} else{//到达底层
cur = st.top();
ans.push_back(cur->val);
st.pop();
cur = cur->right;
}
}
return ans;
}
二叉树后序遍历
法1: 递归
void traversal(TreeNode* cur,vector<int> &v){
//左右中
if (cur == NULL)return;
traversal(cur->left,v);
traversal(cur->right,v);
v.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
traversal(root,ans);
return ans;
}
法2:迭代
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
if (root ==NULL) return ans;
//迭代遍历
//左右中 对调前序遍历结果即可
//前序遍历
stack<TreeNode*> st;
st.push(root);
while (!st.empty()){
//中
TreeNode* node = st.top();
ans.push_back(node->val);
st.pop();
//左
if (node->left != NULL) st.push(node->left);
if (node->right != NULL) st.push(node->right);
}
reverse(ans.begin(),ans.end());
return ans;
}
统一迭代写法待完善