题目描述
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例
示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
解法
1.辅助数组
解题思路
创建一个数组,中序遍历链表,把二叉树中的元素依次加入数组中,由于二叉搜索树性质,得到的数组是非减的,这样就可以直接返回第K小的元素。
cpp
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
vector <int> temp;
Helper(root,temp);
return temp[k - 1];
}
void Helper(TreeNode* root,vector <int>& temp){
if(!root) return;
Helper(root -> left,temp);
temp.push_back(root -> val);
Helper(root -> right,temp);
return;
}
};
时间复杂度O(N),空间复杂度O(N)
2.计数法
解题思路:
如果要求不占用额外空间,则我们需要设计一个计数器,计数器达到k时,立马返回节点的值。
cpp
class Solution {
public:
int count = 0;
int kthSmallest(TreeNode* root, int k) {
int ans;
Helper(root,ans,k);
return ans;
}
void Helper(TreeNode* root,int &ans,int k){
if(!root) return;
Helper(root -> left,ans,k);
count ++;
if(count == k){
ans = root -> val;
return;
}
Helper(root -> right,ans,k);
}
};
时间复杂度O(N),空间复杂度O(1)