235.?二叉搜索樹的最近公共祖先?
思路:
1. 按照搜索普通二叉樹的最近公共祖先進(jìn)行搜素蒲稳,后序遍歷,如果==則返回節(jié)點(diǎn)
2. 根據(jù)二叉搜索樹特性進(jìn)行尋找
邊界條件:
if(root==NULL) return root;
分成三種情況:
1. p&&q都在root左邊伍派,則數(shù)值都比root小江耀。那么當(dāng)數(shù)值都比root小時(shí),繼續(xù)向左遍歷诉植;
2. p&&q都在root右邊祥国,則數(shù)值都比root大。當(dāng)數(shù)值都比root大時(shí)晾腔,繼續(xù)向右遍歷舌稀;
3. pq一個(gè)在左一個(gè)在右,說明root就是最近的公共祖先灼擂,返回root壁查;
看視頻后:
沒有中的處理。
迭代法也很簡(jiǎn)單剔应,因?yàn)榇_定了搜索方向
701.二叉搜索樹中的插入操作
思路:
單獨(dú)建一個(gè)函數(shù)睡腿,返回為void類型:
void?Insert(TreeNode?*root,TreeNode?*newNode)
終止條件:
root==NULL
分情況討論:
如果newNode數(shù)值大于root數(shù)值语御,則應(yīng)該存放在右邊,此時(shí)看root->right是否為空席怪,為空則插入節(jié)點(diǎn)应闯,不為空則向下尋找。小于則存放左側(cè)挂捻,同理碉纺。
看視頻后:
可以在有返回值的情況下實(shí)現(xiàn)。
if (root == NULL) {
? ? TreeNode* node = new TreeNode(val);
? ? return node;
}
把node返回給上一層刻撒。
450.刪除二叉搜索樹中的節(jié)點(diǎn)(二刷注意)
思路:
分情況討論:
1.沒找到骨田,直接return
2.葉子節(jié)點(diǎn),直接刪除
3.有左無右疫赎,變成左
4.有右無左盛撑,變成右
5.有左有右,捧搞?變成右抵卫?怎么處理左?
看視頻后:
刪除需要修改樹的結(jié)構(gòu)胎撇!
終止節(jié)點(diǎn):
1. 如果root==NULL return NULL
2. key==val的情況下分成四種情況介粘,最后一種有左有右,把cur設(shè)置在root->right,找到右子樹下最小節(jié)點(diǎn)while(cur->left!=NULL) cur=cur->left; cur->left=root->left; 返回root->right, 返回右子樹
左遍歷:
如果key小于val晚树,向左遍歷姻采,返回給root->left;
右遍歷:
如果key大于val,向右遍歷,返回給root->right;
最后return root;