二叉搜索樹的插入、刪除、修剪、構造操作(leetcode701、450、669、108)

目錄

  • 1、leetcode 701. 二叉搜索樹中的插入操作
    • 1、題目
    • 2、遞歸法
    • 3、迭代法
  • 2、leetcode 450. 二叉搜索樹中的插入操作
    • 1、題目
    • 2、思路+遞歸法
    • 3、迭代法
    • 4、刪除結點的兩個方法以及注意點
  • 3、leetcode 669. 修剪二叉搜索樹
    • 1、題目
    • 2、思考與遞歸
    • 3、迭代法
  • 4、leetcode 108. 將有序數組轉換為二叉搜索樹
    • 1、題目
    • 2、遞歸思路

1、leetcode 701. 二叉搜索樹中的插入操作

1、題目

給定二叉搜索樹(BST)的根節點和要插入樹中的值,將值插入二叉搜索樹。 返回插入后二叉搜索樹的根節點。
輸入數據 保證,新值和原始二叉搜索樹中的任意節點值都不同。
注意,可能存在多種有效的插入方式,只要樹在插入后仍保持為二叉搜索樹即可。 你可以返回任意有效的結果 。
在這里插入圖片描述
在這里插入圖片描述

2、遞歸法

遞歸返回值以及參數
返回值為空,因為我們進行的是插入操作,不需要知道插在哪兒。
參數:當前結點cur以及需要插入的數值val
終止條件
如果當前指針為空,返回
單層邏輯
首先,按照val的大小,遍歷左右子樹。
如果當前結點的值大于val,且此結點沒有左孩子,則可以將val構造的結點作為其左孩子。
如果當前結點的值小于val,且此結點沒有右孩子,則可以將val構造的結點作為其右孩子。
否則return;
最后在大函數里面返回root就行了。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void traversal(TreeNode* cur,int val){if(cur == NULL) return;if(cur->val > val) traversal(cur->left,val);if(cur->val < val) traversal(cur->right,val);if(cur->val > val && cur->left == NULL){//cout<<"插入左結點"<<endl;TreeNode* ans=new TreeNode(val);cur->left = ans;}if(cur->val < val && cur->right == NULL){//cout<<"插入右結點"<<endl;TreeNode* ans=new TreeNode(val);cur->right = ans;}return;}TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == NULL){TreeNode* ans=new TreeNode(val);return ans;} traversal(root,val);return root;}
};

進行了一些修改后的代碼

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void traversal(TreeNode* cur,int val){if(cur == NULL) return;cout<<cur->val<<endl;if(cur->val > val){traversal(cur->left,val);if(cur->left == NULL){//cout<<"插入左結點"<<endl;TreeNode* ans=new TreeNode(val);cur->left = ans;}} if(cur->val < val){traversal(cur->right,val);if(cur->right == NULL){//cout<<"插入右結點"<<endl;TreeNode* ans=new TreeNode(val);cur->right = ans;}} return;}TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == NULL){TreeNode* ans=new TreeNode(val);return ans;} traversal(root,val);return root;}
};

3、迭代法

在迭代法遍歷的過程中,需要記錄一下當前遍歷的結點的父結點,這樣才能進行插入結點操作。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(root == NULL){TreeNode* ans=new TreeNode(val);return ans;} TreeNode* cur = root;TreeNode* parent = root;//記錄上一個結點,否則不挖賦值新結點while(cur != NULL){parent = cur;if(cur->val > val) cur = cur->left;else cur = cur->right;}TreeNode* node = new TreeNode(val);if(val < parent->val) parent->left = node;        //利用parent的結點的值進行賦值else parent->right = node;return root;}
};

2、leetcode 450. 二叉搜索樹中的插入操作

1、題目

給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的 key 對應的節點,并保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
首先找到需要刪除的節點;
如果找到了,刪除它。
說明: 要求算法時間復雜度為 O(h),h 為樹的高度。
在這里插入圖片描述

2、思路+遞歸法

確定遞歸返回值和參數
通過遞歸返回值來刪除結點。

TreeNode* deleteNode(TreeNode* root, int key)

確定終止條件
遇到空結點返回,說明了沒有找到刪除的結點。

if(root == NULL) return root;

確定單層邏輯
1、沒有找到刪除的結點,遍歷到空結點直接返回。
2、找到了刪除的結點:
【1】如果左右孩子都為空,直接刪除這個結點,返回NULL為根結點
【2】如果左孩子為空,右孩子不為空,刪除結點,右孩子補位,返回右孩子作為根結點
【3】如果右孩子為空,左孩子不為空,刪除結點,左孩子補位,返回左孩子作為根結點
【4】如果左右孩子不為空,則將刪除結點的左子樹的頭結點放到刪除結點的右子樹的最左邊結點的左孩子上,返回刪除結點右孩子,作為新的結點
代表的是中序遍歷序列的下一個節點。即比當前節點大的最小節點在這里插入圖片描述

        if(root->val == val){if(!root->left && !root->right) return root;else if(!root->left && root->right) return root->right;else if(root->left && !root->right) return root->left;else {TreeNode* cur = root->right;//找到右子樹的最左邊結點while(cur->left){cur = cur->left;}cur->left = root->left;TreeNode* tmp = root->left;root = root->right;delete tmp;return root;}}

將新的結點返回給上一層,上一層將其作為左或者右孩子:

if(root->val > key) root->left = deleteNode(root->left,key);
if(root->val < key) root->right= deleteNode(root->right,key);
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root == NULL) return root;if(root->val == key){if(!root->left && !root->right) return NULL;    //直接刪除結點,返回NULLelse if(!root->left && root->right) return root->right;else if(root->left && !root->right) return root->left;else {TreeNode* cur = root->right;//找到右子樹的最左邊結點while(cur->left){cur = cur->left;}cur->left = root->left;TreeNode* tmp = root;root = root->right;delete tmp;return root;}}if(root->val > key) root->left = deleteNode(root->left,key);if(root->val < key) root->right= deleteNode(root->right,key);return root;}
};

3、迭代法

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* deleteOneNode(TreeNode* target){if(target == NULL) return NULL;if(target->right == NULL) return target->left;//如果right不為空,將left轉移到right左子樹的最左值。TreeNode* cur = target->right;while(cur->left) cur = cur->left;cur->left = target->left;//返回target的右子樹,這樣target結點就被刪除了return target->right;}TreeNode* deleteNode(TreeNode* root, int key) {if(root == NULL) return NULL;TreeNode* cur = root;TreeNode* pre = NULL;       //記錄cur的父結點,用來刪除cur//找到目標結點while(cur){if(cur->val == key) break;pre = cur;if(cur->val > key) cur = cur->left;else cur = cur->right;}if(pre == NULL) return deleteOneNode(cur);      //如果搜索樹只有頭結點//刪除右孩子還是刪除左孩子,cur是父結點的左孩子還是右孩子if(pre->left && pre->left->val == key) pre->left = deleteOneNode(cur);if(pre->right && pre->right->val == key) pre->right = deleteOneNode(cur);return root;}
};

4、刪除結點的兩個方法以及注意點

1、移動樹,找到目標結點直接對指針指向進行改變就結束了
2、覆蓋值,找到目標結點先將目標結點的值和目標結點的右子樹的最左邊的值進行交換;交換后,繼續去遞歸遍歷樹,直到再次遍歷到目標結點的值,此時目標結點已經是葉子結點,左右孩子都為NULL,直接就返回NULL指針,實現了刪除操作。(先覆蓋值,后刪除)
3、刪除一個結點不能簡單地置這個結點為空,我們需要修改父結點對此結點的指向!
例如我們需要將root->right覆蓋掉root,不能root = root->right;而是應該這樣寫;
parent是root的父結點,child可能是左孩子也可能是右孩子,需要按照情況指定。

parent->child =  root->right; 

3、leetcode 669. 修剪二叉搜索樹

1、題目

給你二叉搜索樹的根節點 root ,同時給定最小邊界low 和最大邊界 high。通過修剪二叉搜索樹,使得所有節點的值在[low, high]中。修剪樹不應該改變保留在樹中的元素的相對結構(即,如果沒有被移除,原有的父代子代關系都應當保留)。 可以證明,存在唯一的答案。
所以結果應當返回修剪好的二叉搜索樹的新的根節點。注意,根節點可能會根據給定的邊界發生改變。
在這里插入圖片描述
在這里插入圖片描述

2、思考與遞歸

因為是要遍歷整棵樹并且做修改,其實不需要返回值也可以,我們也可以完成修剪。但有返回值,更方便,可以通過遞歸函數的返回值來移除結點

如果當前結點的值小于low,要對該結點的右孩子進行再次搜索,直到找到滿足區間的結點或者空結點,最后返回right結點
如果當前結點的值大于high,要對該結點的左孩子進行再次搜索,直到找到滿足區間的結點或者空結點,最后返回left結點。
自上而下遍歷檢查,直到整棵樹遍歷完。
依次遍歷結點左右孩子,并將返回的結果作為當前結點的左右孩子。
最后返回當前結點。
返回的結點必然是val在區間內或者是空結點。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == NULL) return root;if(root->val < low){TreeNode* right = trimBST(root->right,low,high);return right;}if(root->val > high){TreeNode* left = trimBST(root->left,low,high);return left;}root->left = trimBST(root->left,low,high);root->right = trimBST(root->right,low,high);return root;}
};

細致觀察:

root->left = trimBST(root->left,low,high);

用結點3的左孩子把下一層返回的結點0的右孩子(結點2)接住。此時結點3的右孩子就變成了結點2,將結點0從二叉樹中移除了。
在這里插入圖片描述

錯誤思路記錄:先得到中序遍歷的結果,然后修剪結果數組,然后通過修剪后的數組構造一個二叉搜索樹.但是這個思路是錯誤的,因為單純用一個中序遍歷數組不能構造出唯一的二叉樹,隨意選擇一種方法會改變二叉樹的結構!
如:在這里插入圖片描述low=1,high=3,預期結果應為:
在這里插入圖片描述
但是我們這樣做的結果是:
在這里插入圖片描述

3、迭代法

剪枝的三個步驟:
1、將root移動到[L,R]范圍內
2、剪枝左子樹
3、剪枝右子樹
個人認為這個思路比較好理解一點,雖然繁瑣了些。

class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == NULL) return root;//1、處理頭結點,讓root移動到[L,R]范圍內while(root->val < low || root->val > high){if(root->val < low) root = root->right;       //小于L往右走else root = root->left;                     //大于R的往左走}TreeNode* cur = root;//此時root已經在[L,R]范圍內了,處理左孩子元素小于L的情況while(cur){//如果左孩子比low小,就用左孩子的右孩子替代左孩子while(cur->left && cur->left->val < low){cur->left = cur->left->right;}//一直遍歷左孩子cur = cur->left;}cur = root;//此時root'已經在范圍內,處理右孩子元素大于R的情況while(cur){//如果右孩子比high大,就用右孩子的左孩子替代右孩子while(cur->right && cur->right->val > high){cur->right = cur->right->left;}//一直遍歷右孩子cur = cur->right;}return root;}
};

4、leetcode 108. 將有序數組轉換為二叉搜索樹

1、題目

將一個按照升序排列的有序數組,轉換為一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
在這里插入圖片描述
利用數組構造二叉樹的本質就是尋找分割點,分割點作為當前結點,然后遞歸左區間和右區間。
有序數組的分割點我們選擇數組中間位置的結點。
如果數組長度為偶數,中間結點有兩個,兩者取其一都可以,所以也就造成了答案不是唯一的。

2、遞歸思路

遞歸返回值以及參數
返回值為結點,我們要用返回值來構造中結點的左右孩子。
參數:數組,分割數組的左邊界、分割數組的右邊界,這里我們定義區間是左閉右閉的。

TreeNode* traversal(vector<int>& nums,int left,int right)

終止條件
由于區間的定義為左閉右閉,所以當left>right時,就是空結點了。

if(left > right) return nullptr;

確定單層邏輯
1、取中間值:int mid = left + ((right - left) / 2);這個是取靠左的中間值這樣可以防止right\left過大時導致的數值越界。
2、以中間位置的元素構造結點:
TreeNode* root = new TreeNode(nums[mid]);
3、劃分區間。root->left接住下一層左區間的構造結點,root->right接住下一層的右區間構造的結點。

int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums,left,mid-1);
root->right = traversal(nums,mid+1,right);

對于數組[-10,-3,0,5,9]觀察遍歷過程:

區間0,4
中間結點0
區間0,1
中間結點-10
區間0,-1
中間結點NULL
區間1,1
中間結點-3
區間1,0
中間結點NULL
區間2,1
中間結點NULL
區間3,4
中間結點5
區間3,2
中間結點NULL
區間4,4
中間結點9
區間4,3
中間結點NULL
區間5,4
中間結點NULL

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* traversal(vector<int>& nums,int left,int right){cout<<"區間"<<left<<","<<right<<endl;if(left > right){cout<<"中間結點"<<"NULL"<<endl;return nullptr;}int mid = left + ((right - left) / 2);cout<<"中間結點"<<nums[mid]<<endl;TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums,left,mid-1);root->right = traversal(nums,mid+1,right);return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums,0,nums.size()-1);return root;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Memcached查看和清理

1.一種telnet localhost 11211 #登陸stats #查看狀態flush_all #清理quit #退出2.又學到一個:echo flush_all | nc localhost 112113.1、數據存儲(假設key為test,value為12345) printf "set test 0 1 5\r\n12345\r\n" | nc localhost 11211STORED2.數據取回(假設key為…

模擬退火算法解決np_P和NP問題與解決方案| 演算法

模擬退火算法解決npP問題 (P Problems) P is the set of all the decision problems solvable by deterministic algorithms in polynomial time. P是多項式時間內確定性算法可解決的所有決策問題的集合。 NP問題 (NP Problems) NP is the set of all the decision problems t…

POJ2251Dungeon Master

http://poj.org/problem?id2251 題意 &#xff1a; 就是迷宮升級版&#xff0c;從以前的一個矩陣也就是一層&#xff0c;變為現在的L層&#xff0c;" . "是可以走&#xff0c;但是“#”不可以走&#xff0c;從S走到E&#xff0c;求最短的路徑&#xff0c;若是找不到…

六、聚類算法

一、聚類概念 1&#xff0c;通俗易懂而言&#xff0c;聚類主要運用于無監督學習中&#xff0c;也就是將沒有標簽的東西如何分為幾堆兒。 2&#xff0c;無監督學習即沒有標簽&#xff0c;不知道這些玩意到底是啥。當然&#xff0c;有監督學習就是由標簽&#xff0c;我們是提前知…

Apache服務器通過.htaccess文件設置防盜鏈

用戶經常面對的一個問題就是服務器的流量問題&#xff0c;而站點文件被盜鏈是其中最為主要的部分。所謂盜鏈&#xff0c;是指其他網站直接鏈接我們網站上的文件&#xff0c;一般來 說&#xff0c;盜鏈的對象大多為很耗帶寬的大體積文件&#xff0c;如圖片、視頻等。這樣造成的后…

【C++grammar】string類和array類

目錄1、C11的string類1、創建 string 對象2、追加字符串append函數3、為字符串賦值assign函數4、at, clear, erase, and empty函數5、比較字符串compare()6、獲取子串at() 、substr()函數7、搜索字符串find()8、插入和替換字符串insert() 、replace()9、字符串運算符10、string…

六、聚類算法實戰

所有代碼塊都是在Jupyter Notebook下進行調試運行&#xff0c;前后之間都相互關聯。 文中所有代碼塊所涉及到的函數里面的詳細參數均可通過scikit-learn官網API文檔進行查閱&#xff0c;這里我只寫下每行代碼所實現的功能&#xff0c;參數的調整讀者可以多進行試驗調試。多動手…

超圖軟件試用許可操作步驟_軟件中的操作步驟

超圖軟件試用許可操作步驟The software comprises of three things: Program code, Documentation, and the Operating Procedures. The Program code is the entire software code. The Documentation is produced while the development of the software itself for the time…

mysql 2013錯誤

參考資料&#xff1a; 自由呼吸的世界-mysql 2013錯誤解決 windows下mysql日志文件開啟 今天&#xff0c;莫名其妙的來了個mysql 2013錯誤&#xff0c;導致無法登陸mysql gui工具&#xff0c;而且dos也進不去&#xff0c;提示ping 127.0.0.1,百度google后&#xff1a; 這是在使…

【嵌入式系統】STM32配置FreeRTOS以及利用多線程完成流水燈、按鍵、蜂鳴器、數碼管工作

目錄1、利用STM32CubeMX配置FreeRTOS2、完成流水燈、按鍵、蜂鳴器數碼管工作1、在gpio.c和.h文件里面書寫并聲明按鍵掃描和led、數碼管子程序2、在freertos.c文件里面設置全局變量并且在各自任務中載入程序3、關于FreeRTOS的注意事項1、利用STM32CubeMX配置FreeRTOS 假設我們之…

學好Java開發的關鍵七步

在學習編程的過程中&#xff0c;我覺得不止要獲得課本的知識&#xff0c;更多的是通過學習技術知識提高解決問題的能力&#xff0c;這樣我們才能走在最前方&#xff0c;本文主要講述如何學好Java開發的關鍵七步&#xff0c;更多Java專業知識&#xff0c;廣州瘋狂Java培訓為你講…

css模糊_如何使用CSS模糊圖像?

css模糊Introduction: 介紹&#xff1a; Sometimes even the professional developers tend to forget the various basic properties which can be applied to solve very simple problems, therefore the fundamentals of developing a website or web page should be very …

七、決策樹算法和集成算法

一、決策樹算法 Ⅰ&#xff0c;樹模型 決策樹&#xff1a;從根節點開始一步步走到葉子節點&#xff08;決策&#xff09; 所有的數據最終都會落到葉子節點&#xff0c;既可以做分類也可以做回歸 對于分類&#xff1a;是由眾數決定的&#xff0c;例如爺爺奶奶媽媽都是負數&…

leetcode 538. 把二叉搜索樹轉換為累加樹 思考分析

題目 給出二叉 搜索 樹的根節點&#xff0c;該樹的節點值各不相同&#xff0c;請你將其轉換為累加樹&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每個節點 node 的新值等于原樹中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索樹滿足下列約束條件&…

SQL中GROUP BY語句與HAVING語句的使用

最近在學習SQL Server相關知識&#xff0c;一直不知道怎么使用GROUP BY語句&#xff0c;經過研究和練習&#xff0c;終于明白如何使用了&#xff0c;在此記錄一下同時添加了一個自己舉的小例子&#xff0c;通過寫這篇文章來加深下自己學習的效果&#xff0c;還能和大家分享下&a…

scala語言示例_var關鍵字與Scala中的示例

scala語言示例Scala var關鍵字 (Scala var keyword) The var Keyword in scala is used to declare variables. As Scala does not require explicit declaration of data type of the variable, var keyword is used. The variable declared using the var keyword as mutable…

八、決策樹算法實驗可視化展示

一、樹模型的可視化展示 官網下載安裝包 右擊管理員身份運行&#xff0c;直接下一步即可。 配置環境變量&#xff1a; 將安裝好的可視化軟件的bin文件夾路徑添加到系統環境變量Path下即可 打開cmd&#xff0c;輸入dot -version&#xff0c;出現相關信息即安裝成功 二、決策…

關于在頁面中針對不同版本的IE瀏覽器實現不同的JS或者CSS樣式

一般會用到<!--[if IE]>這里是正常的html代碼<![endif]--> 條件注釋只能在windows Internet Explorer(以下簡稱IE)下使用&#xff0c;因此我們可以通過條件注釋來為IE添加特別的指令。因為這只是IE瀏覽器支持的注釋。 1&#xff0c;條件注釋的基本結構和HTML的注釋…

機器學習筆記:PCA的簡單理解以及應用建議

用notability做的筆記&#xff0c;比較隨意&#xff0c;對于第五點的PCA錯誤使用需要特別強調。 目錄1、PCA與線性回歸2、PCA主成分數量選擇3、壓縮重現4、PCA應用建議5、PCA的錯誤使用1、PCA與線性回歸 2、PCA主成分數量選擇 3、壓縮重現 4、PCA應用建議 5、PCA的錯誤使用

關于asp.net中的錯誤提示“將截斷字符串或二進制數據。 語句已終止。”

好久沒有更新博客了&#xff0c;今天在寫asp.net網站的時候&#xff0c;出現了這個問題。錯誤提示“將截斷字符串或二進制數據。 語句已終止。”通過調試&#xff0c;發現在插入數據的時候&#xff0c;由于插入的數據的字符或者二進制數據的長度大于原來定義的類型的長度。及保…