题目:
Invert a binary tree.

 4

/ \
2 7
/ \ / \
1 3 6 9
to

 4

/ \
7 2
/ \ / \
9 6 3 1
思路:
翻转二叉树,刚开始陷入了一个思维怪圈,认为先正向保存值至一个列表,然后再按照逆向还原这个链表,这种思路太复杂,如果是对称二叉树还好,非对称的就不好做。最后看了下别人的解题答案,很简单。先逆转最底层的两个节点,然后依次向上层逆转。算法复杂度:O(n)。
翻转过程如下:

 4

/ \
2 7
/ \ / \
1 3 6 9

 4

/ \
2 7
/ \ / \
3 1 9 6

 4

/ \
7 2
/ \ / \
9 6 3 1
代码:

  • Definition for a binary tree node.
  • struct TreeNode {
  • int val;
  • TreeNode *left;
  • TreeNode *right;
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  • };
    */

class Solution
{
public:

TreeNode* invertTree(TreeNode* root)
{
    if (root != NULL)
    {
        root->left = invertTree(root->left);
        root->right = invertTree(root->right);

        //swich
        TreeNode *temp = root->left;
        root->left = root->right;
        root->right = temp;
    }

    return root;
}

};
总结:
1、该题困扰已久,主要还是思路问题,思路错了,再怎么折腾都是错的。
2、先找规律,再动手写代码。

亲亲的小宝贝,现在已经不再满足于看着大家吃饭了。

今天跟婆婆体检完吃早餐的时候,米粒儿已经不再满足于眼睛直直的看着大家吃了,而是强烈的哭闹抗议了。没办法,给他一个勺子拿着就往嘴里塞,看我拿盛包子的碗,还伸手要,就把碗给他,又往嘴里塞。婆婆说是饿了,可是刚喂过二十多分钟,为了制止他闹,就想着喂就喂吧,结果刚把他手里的勺子拿过来,就哭闹更凶了,伸手要夺,喂奶都不吃。

哎,米粒儿真的是长大了,知道开始要吃的了,可是妈妈不是好妈妈,给买的米粉还在路上,过几天才能到家,妈妈本来想着等米粒儿满6个月的时候才添加辅食的,但是看米粒儿对辅食的渴望,好吧,等米粒儿五个半月的时候就给添加米粉吧。

2015-8-22 周六 晴
早晨五点起床,五点半出门,在路上喝了碗八宝粥算是早餐。手拎着背包,包里装了一瓶水,遮阳帽,钱包,手机。之所以手拎着背包,是因为这样能保证一只手臂能压得很低,在放松手臂的同时,也保证降低速度,不跑那么快。
六点开跑。起点在沙河,出发时拍了一张照片,太阳刚刚出来,气温还不太高,真是跑步的好天气。

跑步过程中,发现脚上穿的亚瑟士GT2000太紧了,这双鞋子,刚买回来的时候就有点紧,平时都是穿薄丝袜能勉强穿上,今日却穿的双运动袜子,鞋太紧,脚底板一直处于紧绷状态,得不到放松,脚腕也明显受其影响,放松不下来。这样持续了刚开始起步的五公里,由于担心左膝受伤,中途几次想放弃这次跑步计划。直至七公里的时候,身体慢慢适应了这种节奏,小腿和脚腕才慢慢有放松感。使用大腿带动小腿和脚腕跨步,小腿和脚腕完全放松,不用力,这种感觉很是舒服。甚至有种幻觉,跑步就是在放松。

路上的景色很美,特别是进入昌平城区之后的水库路上,树林成荫。

进入十三陵水库后,大约跑了有17公里左右。中间由于百度地图导航错误,多跑了两公里。

十三陵水库果然是跑步、骑行的好地方,路上一直有很多骑车的人,从身边经过。跑步的人也不少,在路上还遇到了一个跑步组织的休息饮水处。

跑步总结:
1、跑步总计22公里,2小时27分,配速6'38''。结束后佳明手表提示VO2 MAX 44,马拉松成绩预测为3:45。呵呵,现在心肺能力提高了,膝盖却成了瓶颈。
2、能保护膝盖的不是昂贵的鞋子,而是你放松的跑姿。
3、放松的跑姿:忘记你正在跑步这件事。完全的放松,放松的小腿,放松的脚腕,放松的脚底板和持续发力的大腿。
4、每周务必有一次 LSD 拉练,这样才能保证身体有充足的耐力。
5、跑步状态小结:

3公里:刚热身;
7公里:身体刚放松
15公里:身体状态最佳,再次调整跑姿,处于跑而不累的状态,跑就是放松。
20公里:气温升高,身体缺水,有点疲劳,跑姿明显变形,脚腕无法放松,大腿无力,步子拖拉。
6、平时仍然需要多做力量训练,力量是成绩和耐力的基础。

题目:
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

_6

   /              \
___2__          ___8__

/ \ / \
0 _4 7 9

     /  \
     3   5 

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

思路:
二叉树两个节点的最近的父节点。二叉树遍历,从根节点遍历左节点和右节点,判断当前节点是否包含两个节点,如果是的话,马上停止遍历,第一次出现的2的时候,即为最近的父节点。如下图,如果目标是寻找3和5的LCA,首先进入6->2->4,那么在4节点先知道该节点包含2个节点,则停止遍历。算法复杂度:O(logN)

_6

   /              \
___2__          ___8__

/ \ / \
0 _4 7 9

     /  \
     3   5

代码:

/**

  • Definition for a binary tree node.
  • struct TreeNode {
  • int val;
  • TreeNode *left;
  • TreeNode *right;
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  • };
    */

class Solution
{
public:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
    m_pAncestor = NULL;

    HasNodeCount(root, p, q);

    return m_pAncestor;
}

//if it return 2, it's the common ancestor,-1 is find it
int HasNodeCount(TreeNode* root, TreeNode* p, TreeNode* q)
{
    if (root == NULL)
    {
        return 0;
    }

    int node_count = 0;
    int left_count = 0;
    int right_count = 0;
    int cur_count = 0;

    if (root->left != NULL)
    {
        left_count = HasNodeCount(root->left, p, q);
    }
     
    if (root->right != NULL)
    {
        right_count = HasNodeCount(root->right, p, q);
    }

    if (p != NULL && root->val == p->val)
    {
        cur_count++;
    }

    if (q != NULL && root->val == q->val)
    {
        cur_count++;
    }

    if (left_count == -1 || right_count == -1)
    {
        return -1;
    }

    node_count = left_count + right_count + cur_count;
    if (node_count == 2)
    {
        m_pAncestor = root;
        return -1;
    }

    return node_count;
}

private:

TreeNode* m_pAncestor;

};

总结:
1、理解Lowest Common Ancestor of a Binary (LCA),即最近父节点。
2、使用迭代的算法,一定要找到其终结点。比如该终结点是 return -1;和return 0;
3、代码比较紊乱,不想整理了,等下次刷题时再优化吧。

受到网络上一组父子每年一张的照片启发,决定给我们家米粒也来每年在同一个时间同一个地点拍摄一张照片,直至我们老去。也是件幸福之事。

时间:2015年~未来很久
地点:奥林匹克森林公园
人物:米粒的爸爸、妈妈和其他亲人(谁在北京就跟谁一起留影吧 O(∩_∩)O~)

第一年、2015年8月9日 晴 周日 奥林匹克森林公园