日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

二叉树的前序,中序,后序的递归、迭代实现

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的前序,中序,后序的递归、迭代实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二叉樹的前序遍歷

遞歸實現

遞歸實現沒什么好說的。個人感覺將函數功能看成一個整體,不要去想棧中怎么實現的。畢竟自己的腦袋不是電腦,繞著繞著就蒙了。

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;}
}

總結

以上是生活随笔為你收集整理的二叉树的前序,中序,后序的递归、迭代实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。