随笔- 509  文章- 0  评论- 151  阅读- 22万 

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   zhuli19901106  阅读(257)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示