【LeetCode-簡單】二叉樹筆記(C++)
阿新 • • 發佈:2022-03-29
目錄
二叉樹筆記(C++)
1 普通二叉樹
遞迴,每到一個新的節點就進行相應的處理。
-
每到一個新的節點,交換它的左右孩子的指向,之後繼續遞迴。
class Solution { public: void traversal(TreeNode *root) { if (root != NULL) { TreeNode *temp = root->right; root->right = root->left; root->left = temp; traversal(root->left); traversal(root->right); } } TreeNode* mirrorTree(TreeNode* root) { traversal(root); return root; } };
-
求最大深度
class Solution { public: int max; void traversal(TreeNode *root, int depth) { if (root != NULL) { if (max < depth) { max = depth; } traversal(root->left, depth + 1); traversal(root->right, depth + 1); } } int maxDepth(TreeNode* root) { traversal(root, 1); return max; } };
-
每遞迴到一個節點,如果 root1 或 root2 存在,就先建立新節點 root3。
之後根據每個節點的情況,給 root3->val 賦值,並對其左孩子和右孩子進行遞迴。
class Solution { public: TreeNode *traversal(TreeNode *root1, TreeNode *root2) { if (root1 == nullptr && root2 == nullptr) { return nullptr; } TreeNode *root3 = new TreeNode(); if (root1 == nullptr) { root3->val = root2->val; root3->left = traversal(nullptr, root2->left); root3->right = traversal(nullptr, root2->right); } else if (root2 == nullptr) { root3->val = root1->val; root3->left = traversal(root1->left, nullptr); root3->right = traversal(root1->right, nullptr); } else { root3->val = root1->val + root2->val; root3->left = traversal(root1->left, root2->left); root3->right = traversal(root1->right, root2->right); } return root3; } TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { TreeNode *root3 = traversal(root1, root2); return root3; } };
-
利用有序的陣列構建最小高度樹。二分,遞迴。
class Solution { public: TreeNode *buildTree(vector<int> &ans, int low, int high) { if (low > high) { return NULL; } int mid = (low + high) / 2; TreeNode *node = new TreeNode(ans[mid]); node->left = buildTree(ans, low, mid - 1); node->right = buildTree(ans, mid + 1, high); return node; } TreeNode* sortedArrayToBST(vector<int>& nums) { TreeNode *root = buildTree(nums, 0, nums.size() - 1); return root; } };
2 二叉搜尋樹
-
特點:當前節點的值比左子樹大,比右子樹小。
-
二叉搜尋樹的中序遍歷序列是一個升序序列。
通過中序遍歷,用 inOrder 陣列來儲存中序結果的序列。
前一題要求返回數值,後一題要求返回節點。
// 劍指 Offer 54. 二叉搜尋樹的第k大節點 class Solution { public: void traversal(TreeNode *root, vector<int> &inOrder) { if (root != NULL) { traversal(root->left, inOrder); inOrder.push_back(root->val); traversal(root->right, inOrder); } } int kthLargest(TreeNode* root, int k) { vector<int> inOrder; traversal(root, inOrder); return inOrder[inOrder.size() - k]; } };
// 700. 二叉搜尋樹中的搜尋 class Solution { public: TreeNode *search(TreeNode *root, int val) { if (root != nullptr) { if (root->val > val) { return search(root->left, val); } else if (root->val < val) { return search(root->right, val); } else { // root->val == val return root; } } return nullptr; } TreeNode* searchBST(TreeNode* root, int val) { TreeNode *res = search(root, val); return res; } };
-
序列已經給定,使用二分法建樹。
class Solution { public: TreeNode *traversal(vector<int> &nums, int low, int high) { if (low <= high) { int mid = (low + high) / 2; TreeNode *node = new TreeNode(nums[mid]); node->left = traversal(nums, low, mid - 1); node->right = traversal(nums, mid + 1, high); return node; } return nullptr; } TreeNode* sortedArrayToBST(vector<int>& nums) { TreeNode *root = traversal(nums, 0, nums.size() - 1); return root; } };
-
每遍歷到一個節點,判斷它的值是否在規定的範圍([low, high])內,
如果是,則範圍遞迴左右子樹節點之和;
如果 < low,則對當前節點的右子樹進行遞迴;
如果 > high,則對當前節點的左子樹進行遞迴。class Solution { public: int rangeSumBST(TreeNode* root, int low, int high) { if (root == nullptr) { return 0; } if (root->val >= low && root->val <= high) { return root->val + rangeSumBST(root->left, low, high) + rangeSumBST(root->right, low, high); } else if (root->val > high) { return rangeSumBST(root->left, low, high); } else { // root->val < low return rangeSumBST(root->right, low, high); } } };
3 N 叉樹(普通樹)
-
N 叉樹的每一個節點的子節點數目不確定。
-
N 叉樹的遍歷
N 叉樹的前序遍歷對應於二叉樹的前序遍歷:先根節點,後子節點。
後序遍歷對應於二叉樹的後序遍歷:先子節點,後根節點。
-
題目連結:
-
前序遍歷
class Solution { public: void postOrderTraversal(Node *root, vector<int> &ans) { if (root != nullptr) { int size = root->children.size(); for (int i = 0; i < size; i++) { postOrderTraversal(root->children[i], ans); } ans.push_back(root->val); } } vector<int> postorder(Node* root) { vector<int> ans; postOrderTraversal(root, ans); return ans; } };
後序遍歷
class Solution { public: void postOrderTraversal(Node *root, vector<int> &ans) { if (root != nullptr) { int size = root->children.size(); for (int i = 0; i < size; i++) { postOrderTraversal(root->children[i], ans); } ans.push_back(root->val); } } vector<int> postorder(Node* root) { vector<int> ans; postOrderTraversal(root, ans); return ans; } };
-