98. Validate Binary Search Tree

题目

分析:BST按照中序遍历之后所得到的序列是一个递增序列,因此可以按照这个思路,先中序遍历,保存好遍历的结果,然后在遍历一遍这个序列。判断其是否递增

代码如下:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isValidBST(TreeNode* root) {
13         if(NULL == root)
14             return true;
15         vector<int> res;
16         inOrderTraversal(root,res);
17         for(int i=1;i<res.size();i++)
18         {
19             if(res[i]<=res[i-1])
20                 return false;
21         }
22         return true;
23     }
24     void inOrderTraversal(TreeNode* root,vector<int> &res)
25     {
26         if(NULL==root)
27             return;
28         inOrderTraversal(root->left,res);
29         res.push_back(root->val);
30         inOrderTraversal(root->right,res);
31         
32     }
33 };

上面的实现中,使用了一个vector,需要额外的O(n)空间,但是仔细一想,当在保存某一个之值时,只需要判断在它之前的那个数是否小于它,如果小于,则继续遍历,如果不小于,则可以返回false。

代码如下,每次递归调用的时候,都将当前已经遍历的最大数字保存在key中即可

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isValidBST(TreeNode* root) {
13         if(NULL == root)
14             return true;
15         
16         long long key = -2147483649;
17         return inOrderTraversal(root,key);
18         
19     }
20     bool inOrderTraversal(TreeNode* root,long long &key)
21     {
22         if(NULL==root)
23             return true;
24         bool flag = inOrderTraversal(root->left,key);
25         if(flag == false)
26             return false;
27         if(root->val <= key)
28         {
29             return false;
30         }
31         key = root->val;
32         flag = inOrderTraversal(root->right,key);
33         if(flag == false)
34             return false;
35         return true;
36         
37 
38             
39         
40     }
41 };

 -----------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------

100. Same Tree

题目

分析:

判断两棵树结构是否相同,只需要递归判断其左右子树是否分别相同,并且当前节点的值也相同即可。

代码如下:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11   public:
12       bool isSameTree(TreeNode *p, TreeNode *q) {
13           if (NULL == p && NULL == q)
14           {
15               return true;
16           }
17           else if (NULL != p && NULL == q)
18           {
19               return false;
20           }
21           else if (NULL == p && NULL != q)
22           {
23               return false;
24           }
25 
26           if (p->val != q->val)
27           {
28               return false;
29           }
30 
31           return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
32 
33 
34       }
35   };

 --------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------

101. Symmetric Tree

题目

分析:

这道题目,其实就是二叉树广度优先遍历的变形,只是每次入队列的方式和广度优先遍历算法中入队列的方式不同,详细见代码

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12   bool isSymmetric(TreeNode *root) {
13       queue<TreeNode *> myQueue;
14       if (NULL == root)
15       {
16           return true;
17       }
18       if (NULL != root->left && NULL != root->right)
19       {
20           myQueue.push(root->left);
21           myQueue.push(root->right);
22       }
23       else if (NULL == root->left && NULL == root->right)
24       {
25           return true;
26       }
27       else
28           return false;
29 
30       TreeNode *temp1,*temp2;
31 
32       while(!myQueue.empty())
33       {
34           temp1 = myQueue.front();
35           myQueue.pop();
36           temp2 = myQueue.front();
37           myQueue.pop();
38           if (NULL == temp1 && NULL == temp2)
39           {
40               continue;
41           }
42           else if (NULL != temp1 && NULL == temp2)
43           {
44               return false;
45           }
46           else if (NULL == temp1 && NULL != temp2)
47           {
48               return false;
49           }
50           else if (temp1->val == temp2->val)
51           {
52               myQueue.push(temp1->left);//左节点
53               myQueue.push(temp2->right);//右节点
54               myQueue.push(temp1->right);
55               myQueue.push(temp2->left);                        
56           }
57           else
58               return false;
59 
60       }
61       return true;
62 
63   }
64 };

 ----------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------

102. Binary Tree Level Order Traversal

题目

分析:

二叉树的广度优先遍历,代码如下:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<vector<int> > levelOrder(TreeNode *root) {
13         vector<vector<int> > res;
14         stack<vector<int> > tempStack;
15         
16         vector<int> temp;
17         TreeNode *pNode=NULL;
18         temp.clear();
19         res.clear();
20         if (NULL == root)
21         {
22             return res;
23         }
24 
25         queue<TreeNode *> myQue;
26         myQue.push(root);
27         while (!myQue.empty())
28         {
29             myQue.push(NULL);//通过NULL标志进行分层
30             temp.clear();
31             pNode = myQue.front();
32             myQue.pop();
33             while (NULL != pNode)
34             {
35                 temp.push_back(pNode->val);
36                 if (NULL != pNode->left)
37                 {
38                     myQue.push(pNode->left);
39                 }
40                 if (NULL != pNode->right)
41                 {
42                     myQue.push(pNode->right);
43                 }
44                 pNode = myQue.front();
45                 myQue.pop();
46 
47             }
48             
49             res.push_back(temp);
50             
51         }
52         return res;       
53     }
54 };