剛開始我想的很簡單,覺得只要遞迴判斷左孩子是否小於根節點 右孩子是否大於根節點就行了
//二叉搜尋樹 = 左孩子 < 根結點 && 右孩子 > 根節點
//下面的寫法 錯的!!!!錯的!!!
//二叉樹的判斷應該是左子樹的最大值 小於 根節點 右子樹的最小值大於根節點
bool isvalidbst(treenode *root)
if(root->left !=
null
&& root->left->val > root->val)
if(root->right !=
null
&& root->right->val < root->val)
return isvalidbst(root->left) && isvalidbst(root->right);
}
#include
#include
using
namespace
std;
struct treenode
};class solution
treenode *buildtree(vector
&inorder, int ileft, int iright, vector
&postorder, int pleft, int pright)
treenode *cur = new treenode (postorder[pright]);
int i = 0;
for(i = ileft; i < inorder.size(); ++i)
}cur->left = buildtree(inorder, ileft, i - 1, postorder, pleft, pleft + i - ileft - 1);
cur->right = buildtree(inorder, i + 1, iright, postorder, pleft + i - ileft, pright - 1);
return cur;
}//前序遍歷輸出
void preorderdisplay(treenode *root)
else
}//方法一
//根據二叉搜尋樹的特點: 二叉搜尋樹的中序遍歷是遞增的 判斷一下就行了
bool isvalidbst1(treenode *root)
vector
res;
inorderdisplay(root, res);
cout
<< endl;
for(int j = 0; j < res.size(); ++j)
for(int i = 1; i < res.size(); ++i)
}return
true;
}//中序遍歷生成序列
void inorderdisplay(treenode *root, vector
& res)
else
} //方法二
//前序遍歷 當前節點的值是左子樹的最大值,同時是右子樹的最小值
bool isvalidbst2(treenode *root)
return isbst_preorder(root, int_min, int_max);
} bool isbst_preorder(treenode *root, int minval, int maxval)
if(root->val < minval || root->val > maxval)
return isbst_preorder(root->left, minval, root->val) && isbst_preorder(root->right, root->val, maxval) ;
}};int main();
vector
postorder = ;
treenode *root = s.buildtree(inorder, postorder);
s.preorderdisplay(root);
bool flag = s.isvalidbst2(root);
if(flag)
else
system("pause");
return
0;}
二叉樹 判斷二叉樹是否為完全二叉樹
問題描述 判斷一棵二叉樹是否為完全二叉樹。知識點 完全二叉樹是指除二叉樹的最後一層外,其他各層的節點數達到最大個數,且最後一層的葉節點從左到右連續存在,只缺右側若干節點。演算法實現 class node is complete binary tree public static boolean is...
判斷該二叉樹是否為搜尋二叉樹和完全二叉樹。
轉向我的部落格位址 題目描述 給定一棵二叉樹,已經其中沒有重複值的節點,請判斷該二叉樹是否為搜尋二叉樹和完全二叉樹。示例1輸入 輸出 true,true 備註 n 500000 其中,判斷搜尋二叉樹,只需要中序遍歷一次,取出值,看是否是遞增即可。判斷是否是完全二叉樹,只需要按層遍歷一次,找到第乙個n...
判斷二叉樹是否為平衡二叉樹
一 線性思維 遍歷每個節點都時候,求左右子樹的深度,如果左右子樹深度相差不超過1,繼續遞迴遍歷左右節點,此種方法會重複遍歷,時間效率不高 is balanced t if t is null return true left treedepth t.left right treedepth t.ri...