二叉排序樹之遞迴陷阱

2021-06-22 12:14:56 字數 2363 閱讀 5401

判是否是二叉排序樹,看似想到遞迴來判,因為二叉樹之類的都是遞迴定義,判定遞迴自然很好理解,結果發現掛了

if(root==null) return true;

if(root->left==null&&root->right!=null)

return (root->valright->val) && isvalidbst(root->left) && isvalidbst(root->right);

if(root->right==null&&root->left!=null)

return (root->left->valval) && isvalidbst(root->left) && isvalidbst(root->right);

if(root->left==null&&root->right==null)

return true;

return (root->left->valval) && (root->valright->val) && isvalidbst(root->left) && isvalidbst(root->right);

結果掛了,想不通,之前左右子樹空的幾種組合情況還沒考慮,因為後面還有left right 訪問val的語句。後來再看一遍定義,懂了。

雖說他是遞迴定義的,但是它是指整個左子樹都小於根,整個右子樹都大於根,如果只是左孩子右孩子小於大於根上面遞迴是沒有問題的,但是現在不行,例如上述語句會把左孩子雖然是二叉排序樹,但是有乙個最大的比根大的二叉樹包含進來,也即r->left->val< r->val, r->left->val< r->left最右下->val 這兩句退不出 r->left最右下->val  val 

簡單說就是a

只能乖乖中序遍歷,然後看是否單調遞增排序,還不能非遞減,因為定義是嚴格小於 大於

附上**:

bool isvalidbst(treenode *root) 

p=s.top();

s.pop();

order.push_back(p->val);

p=p->right;

//if(s->right!=null)

// s.push(s->right);

//if(s->left!=null)

// s.push(s->left);

}for(int i=0;i=order.at(i+1))

return false;

}return true;

/*if(root==null) return true;

if(root->left==null&&root->right!=null)

return (root->valright->val) && isvalidbst(root->left) && isvalidbst(root->right);

if(root->right==null&&root->left!=null)

return (root->left->valval) && isvalidbst(root->left) && isvalidbst(root->right);

if(root->left==null&&root->right==null)

return true;

return (root->left->valval) && (root->valright->val) && isvalidbst(root->left) && isvalidbst(root->right);

*/}

另外還有一道回文串,一開始學程舍就接觸過的,這次不考慮非數字字母的字元,裡面還是有越界判斷又忘了,另外急於提交,連邏輯判斷語句都寫錯了= =

bool ispalindrome(string s) 

else

}return true;

}

另外看到了裡面lefti

今天偶然看到部落格分析二叉樹的性質,因為擴充套件到圖的時候還是比較有用的。

1. ni 表示度數(孩子數)為i的結點個數,n為總結點數,m為邊數或總度數

n2+n1+n0=n=m+1

2n2+n1=m

兩式一減 n2-n0=-1   n0=n2+1

所以二叉樹的葉子結點(終端結點,度為0的結點) 與度為2的結點的個數總是差一

2   i層有2^(i-1) 個結點

3   n個結點二叉樹有 上界(log2(n+1))  或下屆(log2n)+1高度

4   高度為h的二叉樹做多2^h-1個結點

5   有n+1 個空指標域  n個結點,m個邊,m=n-1 共2n個指標域 所以剩n+1個指標域,這些域也是用來建線索二叉樹,儘管想到那個繁瑣的東西就頭大= =

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...