题目
给定一棵完全二叉树,返回最后一层的最右边的节点。
思路
层次遍历,用一个last变量记录每次出队列的值,遍历结束之后last变量记录的就是所求节点。时间、空间复杂度都是O(N)。
递归,求子树的高度:如果当前根节点为叶子节点,则返回;如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树继续递归。由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层,每次都求树的高度,时间复杂度为O(lgN * lgN)。
代码
1 递归
/*
* 递归
* 求子树高度:如果当前根节点为叶子节点,则返回
* 如果左子树高度>右子树高度,则在左子树递归
* 否则在右子树递归
* 时间复杂度O(logN * logN) (求高度 * 遍历层数)
*/
class Solution {
public:
TreeNode* getLastNode(TreeNode* root) {
if(!root || root->left == nullptr)
return root;
int leftHeight = 0; // 左子树高度