题目:
给定一棵完全二叉搜索树,返回最后一个最右边的节点。如下图,则返回8。
5
/ \
3 7
/ \ / \
2 4 6 8
解析:
方法一: 递归,求子树的高度:如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树继续递归。如果当前节点为叶子节点,则返回;由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层,每次都求树的高度。时间复杂度为O(lgN * lgN)。
参考答案:
/***
* typedef struct node{
* int val;
* struct node *left;
* struct node *right;
* }TreeNode;
*/
class Solution{
public:
TreeNode* getLastNode(TreeNode* root) {
if (!root || root->left == nullptr) {
return root;
}
int leftHeight = 0;
TreeNode* node = root->left;
while (node) {
node = node->left;
++leftHeight;
}
int rightHeight = 0;
TreeNode* node = root->right;
while (node) {
node = node->right;
rightHeight++;
}
if (leftHeight > rightHeight) {
return getLastNode(root->left);
} else {
return getLastNode(root->right);
}
}
};