二叉树的前序,中序,后序的递归、迭代实现
生活随笔
收集整理的這篇文章主要介紹了
二叉树的前序,中序,后序的递归、迭代实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二叉樹的前序遍歷
遞歸實現
遞歸實現沒什么好說的。個人感覺將函數功能看成一個整體,不要去想棧中怎么實現的。畢竟自己的腦袋不是電腦,繞著繞著就蒙了。
void preordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;container.push_back(root->val);preordered_traversal_recursion(root->left);preordered_traversal_recursion(root->right);
}
迭代實現
迭代通過棧來實現,具體過程如下圖所示。
函數實現:
void preordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;tree_s.push(root);while(!tree_s.empty()){TreeNode* node = tree_s.top();tree_s.pop();// 取出中間節點的值container.push_back(node->val);// 右節點if(node->right) tree_s.push(node->right);// 左節點if(node->left) tree_s.push(node->left);}return;
}
二叉樹的后序遍歷
遞歸
void postordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;postordered_traversal_recursion(root->left);postordered_traversal_recursion(root->right);container.push_back(root->val);
}
迭代
后序遍歷的順序為左右中。在不知道中間節點的情況下無法獲得左、右節點。因此先遍歷中右左,然后reverse一下就行了。
函數實現:
void postordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;tree_s.push(root);while (!tree_s.empty()){TreeNode* node = tree_s.top();tree_s.pop();container.push_back(node->val);if(node->left) tree_s.push(node->left);if(node->right) tree_s.push(node->right);}reverse(container.begin(),container.end());return;
}
二叉樹的中序遍歷
遞歸
void inordered_traversal_recursion(TreeNode* root)
{if(root == NULL) return;inordered_traversal_recursion(root->left);container.push_back(root->val);inordered_traversal_recursion(root->right);
}
迭代
中序遍歷的迭代比較麻煩。因為其遍歷順序為左中右。在不知道中間節點的情況下,無法取出左節點的值。
迭代的基本思想是:1)將左側的節點全部壓入棧中。2)取出棧頂元素,即最左下角的節點。3)判斷該節點有沒有右節點,有右節點的話,壓入棧中,然后重復1),2)。沒有的話,繼續彈出棧頂元素。
看下面的圖可能會比較好理解。
函數實現:
void inordered_traversal_iteration(TreeNode* root)
{stack<TreeNode*> tree_s;if(root == NULL) return;while(!tree_s.empty() || root != NULL){// 將左側節點全部壓入棧中,找到最左側的節點while(root != NULL){tree_s.push(root);root = root->left;}// 取出最左側的節點root = tree_s.top();tree_s.pop();container.push_back(root->val);// 從最左側節點的右節點開始新的一輪遍。root = root->right;}
}
總結
以上是生活随笔為你收集整理的二叉树的前序,中序,后序的递归、迭代实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷哪些项目收费
- 下一篇: C++排序算法实现(更新中)