2014-03-19 04:11

题目:设计算法检查一棵二叉树是否为二叉搜索树。

解法:既然是二叉搜索树,也就是说左子树所有节点都小于根,右子树所有节点都大于根。如果你真的全都检查的话,那就做了很多重复工作。只需要将左边最靠右,和右边最靠左的节点和根进行比较,然后依照这个规则递归求解即可。

代码:

 1 // 4.5 Check if a binary tree is binary search tree.
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 struct TreeNode {
 6     int val;
 7     TreeNode *left;
 8     TreeNode *right;
 9     
10     TreeNode(int _val = 0): val(_val), left(nullptr), right(nullptr) {};
11 };
12 
13 void constructBinaryTree(TreeNode *&root)
14 {
15     int val;
16     
17     scanf("%d", &val);
18     if (val <= 0) {
19         root = nullptr;
20     } else {
21         root = new TreeNode(val);
22 
23         constructBinaryTree(root->left);
24         constructBinaryTree(root->right);
25     }
26 }
27 
28 bool postorderTraversal(TreeNode *root, TreeNode *&left_most, TreeNode *&right_most)
29 {
30     TreeNode *ll, *lr, *rl, *rr;
31     bool res_left = true, res_right = true;
32     
33     if (root->left != nullptr) {
34         if (!postorderTraversal(root->left, ll, lr)) {
35             return false;
36         }
37         if (lr->val >= root->val) {
38             // all left nodes must be smaller than the root.
39             return false;
40         }
41     } else {
42         ll = lr = root;
43     }
44     
45     if (root->right != nullptr) {
46         if (!postorderTraversal(root->right, rl, rr)) {
47             return false;
48         }
49         if (rl->val <= root->val) {
50             // all right nodes must be greater than the root.
51             return false;
52         }
53     } else {
54         rl = rr = root;
55     }
56     left_most = ll;
57     right_most = rr;
58     
59     return true;
60 }
61 
62 void clearBinaryTree(TreeNode *&root) {
63     if (root == nullptr) {
64         return;
65     } else {
66         clearBinaryTree(root->left);
67         clearBinaryTree(root->right);
68         delete root;
69         root = nullptr;
70     }
71 }
72 
73 int main()
74 {
75     TreeNode *root;
76     TreeNode *left_most, *right_most;
77     
78     while (true) {
79         constructBinaryTree(root);
80         if (root == nullptr) {
81             break;
82         }
83         
84         left_most = right_most = nullptr;
85         if (postorderTraversal(root, left_most, right_most)) {
86             printf("Yes\n");
87         } else {
88             printf("No\n");
89         }
90         
91         clearBinaryTree(root);
92     }
93     
94     return 0;
95 }

 

 posted on 2014-03-19 04:15  zhuli19901106  阅读(255)  评论(0编辑  收藏  举报