育碧要重返Steam?Connect客戶端已新增到Steam預設包中
阿新 • • 發佈:2021-11-30
1. 概念
樹是連通的無環圖,最常利用的有二叉樹,即一個節點最多隻有兩個子節點,稱為左子樹和右子樹。但是樹都是相通的,無論是二叉樹或者多個節點的樹都能一般能用遞迴方法進行求解。二叉樹節點之間的順序一般不可調換,在資料結構定義時,左是左,右是右,不會說節點1,節點2。
二叉排序樹又叫二叉查詢樹或者二叉搜尋樹:
1)若左子樹不空,則左子樹上所有結點的值均小於它的根節點的值;
2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3)左、右子樹也分別為二叉排序樹;4)沒有鍵值相等的節點
2. 樹的各種遍歷
前序遍歷,根-->左子樹-->右子樹
中序遍歷,左子樹-->根-->右子樹
後序遍歷,左子樹-->右子樹-->根
前序/後序+中序能夠確定一個完整的樹結構,因為前序/後序的根在第一位/最後一位,這樣在中序中找到對應的根節點,以此遞迴,具體的題見leetCode105、106
廣度優先遍歷(Breadth FirstSearch,BFS,實際上就是逐層查詢,又叫層次遍歷,寬度優先搜尋或橫向優先搜尋)
1 class Solution { 2 public: 3 vector<vector<int>> levelOrder(TreeNode* root) { 4 queue<TreeNode*> que;5 if (root != NULL) que.push(root); 6 vector<vector<int>> result; 7 while (!que.empty()) { 8 int size = que.size(); 9 vector<int> vec; 10 // 這裡一定要使用固定大小size,不要使用que.size(),因為que.size是不斷變化的 11 for (int i = 0; i < size; i++) {12 TreeNode* node = que.front(); 13 que.pop(); 14 vec.push_back(node->val); 15 if (node->left) que.push(node->left); 16 if (node->right) que.push(node->right); 17 } 18 result.push_back(vec); 19 } 20 return result; 21 } 22 };
深度優先遍歷(Depth First Search,DFS,主要有三種子方法,前中後序遍歷)
前中後序遍歷的遞迴寫法
1 class Solution { 2 public: 3 //前序遍歷: 4 void traversal(TreeNode* cur, vector<int>& vec) { 5 if (cur == NULL) return; 6 vec.push_back(cur->val); // 中 7 traversal(cur->left, vec); // 左 8 traversal(cur->right, vec); // 右 9 } 10 vector<int> preorderTraversal(TreeNode* root) { 11 vector<int> result; 12 traversal(root, result); 13 return result; 14 } 15 }; 16 //中序遍歷: 17 void traversal(TreeNode* cur, vector<int>& vec) { 18 if (cur == NULL) return; 19 traversal(cur->left, vec); // 左 20 vec.push_back(cur->val); // 中 21 traversal(cur->right, vec); // 右 22 } 23 //後序遍歷: 24 void traversal(TreeNode* cur, vector<int>& vec) { 25 if (cur == NULL) return; 26 traversal(cur->left, vec); // 左 27 traversal(cur->right, vec); // 右 28 vec.push_back(cur->val); // 中 29 }