二叉樹的各類遍歷方法
二叉樹的遍歷主要有三種,前序、中序、後序;
前序遍歷:先訪問根節點,再訪問左子樹,最後訪問右子樹
中序遍歷:先訪問左子樹,再訪問根節點,最後訪問右子樹
後序遍歷:先訪問左子樹,再訪問右子樹,最後訪問根節點
前序遍歷:ABDFGHIEC
中序遍歷:FDHGIBEAC
後序遍歷:FHIGDEBCA
遞歸實現:
前序:
vector<int> vector<int> preorderTraversal(TreeNode* root){
vector<int> ret;
dfsPreOrder(root,ret);
return ret;
}
void dfsPreOrder(TreeNode* root,vector<int> &ret){
if(root==NULL) return;
ret.push_back(root->val);//存儲根節點
if(root->left!=NULL) dfsPreOrder(root->left,ret);//訪問左子樹
if(root->right!=NULL) dfsPreOrder(root->right,ret);//訪問右子樹
}(TreeNode* root){
vector<int> ret;
dfsPreOrder(root,ret);
return ret;
}
void dfsPreOrder(TreeNode* root,vector<int> &ret){
if(root==NULL) return;
ret.push_back(root->val);
if(root->left!=NULL) dfsPreOrder(root->left,ret);
if(root->right!=NULL) dfsPreOrder(root->right,ret);
}
中序:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ret;
inorder(root,ret);
return ret;
}
void inorder(TreeNode* p,vector<int>& ret)
{
if(p==NULL) return;
inorder(p->left,ret);
ret.push_back(p->val);
inorder(p->right,ret);
}
後序:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ret;
inorder(root,ret);
return ret;
}
void inorder(TreeNode* p,vector<int>& ret)
{
if(p==NULL) return;
inorder(p->left,ret);
inorder(p->right,ret);
ret.push_back(p->val);
}