一開始的思路是憑藉乙個pre指標,pre指標指向當前遍歷節點的父節點,然後當發現該節點不符合要求時,利用二叉搜尋樹的性質,若該節點是小於左邊界的,則它的左子樹也勢必不符合要求,此時將該節點的父節點指向該節點的右子樹。當該節點的值大於r時同理。但是沒成功,自己沒想到這種方法的解決辦法,感覺乙個原因是因為根節點的父節點這個問題不好處理。但是這種帶著父節點引數的問題以後還是要注意總結。
class solution
else if(root->val>r)//那麼root的右子樹就不用看了
dfs(root,root->right,l,r);
}treenode* trimbst(treenode* root, int l, int r)
};感覺最近做的樹的相關題目,都是在dfs裡面進行操作,且沒加返回值,這樣不加返回值的做法,經常出問題。
下面貼一段比較正派的思路
treenode* trimbst(treenode* root, int l, int r)
if(root->val < l)
if(root->val >r)
root->left = trimbst(root->left,l,r);
root->right = trimbst(root->right,l,r);
return root;
}
所以不只是不加返回值的操作要會,這種帶返回值的也要會。這裡要想明白乙個問題,即我們題目要求的斷鏈,接鏈操作,是通過,不是靠自己接鏈來做的,而是靠返回指標來實現的。(這個地方必須重點注意)
我自己用樣例想了想,發現這樣依靠返回指標是可以的。
669 修剪二叉搜尋樹
root為空直接返回null root不為空 要麼左邊出界 root val很小,則root的左子樹值更小就不用看了,但root的右子樹中仍可能找到符合要求的結點,因此將root right看作新的根節點繼續去找,並返回給上一層連線 要麼右邊出界 同理,將root left看作新的根節點繼續去找,並...
669 修剪二叉搜尋樹
一道easy題目,但是直接上手有點難度,麻煩的地方在於會改變二叉樹的結構 注意這是一顆二叉搜尋樹,應該能利用到二叉搜尋樹的性質來遍歷 然後給定區間是 lo w,hi gh low,high low,h igh 一顆二叉搜尋樹的定義是左小右大的,那麼一共還是三種情況,設根節點的值是val 則low v...
LeetCode 669 修剪二叉搜尋樹
給定乙個二叉搜尋樹,同時給定最小邊界l 和最大邊界 r。通過修剪二叉搜尋樹,使得所有節點的值在 l,r 中 r l 你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜尋樹的新的根節點。如果當前節點值大於r,則說明該節點的右子樹都大於r 所以可直接捨棄該節點的右子樹,然後再繼續往左子樹 找打 r...