摘要: 难点:跟踪前一个节点,正确清除右节点 1 class Solution { 2 public: 3 void flatten(TreeNode* root) { 4 if(root==NULL) 5 return; 6 TreeNode* head=root; 7 stack<TreeNode*> 阅读全文
posted @ 2016-07-28 10:10 vaevaevae 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 这道题目关键是先得到上下两层的起始节点,然后分几种情况分别处理:1.下层节点是上层节点的左子节点,且上层节点的右子节点非空。2.下层节点是上层节点的左子节点且上层节点的右子节点为空,或者下层节点是上层节点的右子节点。3.上层节点没有孩子。 分清楚了情况就简单了。 阅读全文
posted @ 2016-07-28 09:46 vaevaevae 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 这个题比前序遍历难在,当tmp等于NULL时,stack需要不断地弹出节点,直到检查到一个节点,它的右节点不为空而且还没有被遍历过。这个判断条件写出来还是比较难。 当然,另一种巧妙的做法是,用前序遍历(按右根左的顺序)来求得数组,然后把数组做一个翻转就行。 阅读全文
posted @ 2016-07-28 09:35 vaevaevae 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 递归前序遍历比较简单,非递归则需要用栈来设计遍历方法。 注意有栈为空但还未遍历完整棵树的情况,因此判断条件需要判断tmp是否为NULL 阅读全文
posted @ 2016-07-28 09:18 vaevaevae 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 这道题一个直观做法是对二叉树进行前序遍历,遍历时跟踪路径,当遍历到一个指定节点时,就把路径记下来。然后对比找到的两条路径,找出最后一个相同的节点。 另一个想法是,找到最小子树能够包含这两个节点。因此编程时可以考虑,如果找到了一个节点,就返回该节点,因为另一个节点如果在别的子树上,继续寻找就没有意义; 阅读全文
posted @ 2016-07-28 09:07 vaevaevae 阅读(179) 评论(0) 推荐(0) 编辑