114. Flatten Binary Tree to Linked List
题意理解
还是分为三部分的情况,假设分为root, root.left, root.right,
假设这两边都是有序的情况,就是类似与于交换进行值即可的情况,先递归处理左边的节点,然后再对右边的元素进行同样的操作
if(root.left!=null){进行操作}
然后flattern(root.right)
Efficient Without Additional Data StructureRecursively look for the node with no grandchildren and both left and right child in the left sub-tree. Then store node->right in temp and make node->right=node->left. Insert temp in first node NULL on right of node by node=node->right. Repeat until it is converted to linked list.
For Example,
题意理解就是
求一个树的前序遍历,然后连接成为一个链表即可
还是树当中经典的三段方法
- 判断根节点
- 处理左边的情况(已经是满足的情况了)递归在这个位置进行处理基本情况
- 处理右边的情况
步骤
-
如果左孩子节点部位空的话,直接调用函数,递归处理该种情况
-
交换左右节点的情况(分割为两个树)
- 先保留右边孩子节点tmp
- root.right = root.left
- root.left = null
- 找到root.right的最后一个节点p
- p.right = tmp -
继续递归调用该函数对root.right进行同样的处理
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181111214042358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4MzUwOTk3,size_16,color_FFFFFF,t_70)
整体方法情况
/**
* 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:
void flatten(TreeNode* root) {
//整体的方法来解决该问题即可,递归的出口问题
if (root == NULL || root->left == NULL && root->right == NULL) { return;}
if(root->left!=NULL)
{
flatten(root->left);
//先保持左边的情况
TreeNode * temp= root->right;
root->right = root->left;
root->left =NULL;
TreeNode * p = root->right;
//来到最后一个节点处,最右的的一个节点,情况下
while(p->right!=NULL)
{
p = p->right;
}
p->right = temp;
}
// flatten(righ), 上述
注意在这里面的root 跟上述递归处理当中的root 不是一个东西
flatten(root->right);
}
};
递归处理左边的节点情况
一直要找到9那边的最右节点元素
Java 版
public void flatten(TreeNode root) {
if(root==null||(root.right==null&&root.left==null))
return;
if(root.left!=null){
flatten(root.left);
TreeNode temp = root.right;
root.right = root.left;
root.left = null;
// 在这里就是完成了一个过程的情况
TreeNode p = root.right;
while(p.right!=null){
p=p.right;
}
//找到最左边的情况下面如何进行,
p.right= temp;
}
//上图当中的flatten(right)处的代码情况, 处理下面的一个情况
这里面的
flatten(root.right);
}
关键是怎样将 5
(20) My short post order traversal Java solution for share - LeetCode Discuss
解法的解释说明) LeetCode 114. Flatten Binary Tree to Linked List - YouTube
最好的解法办法(也是比较好理解的情况)
class Solution {
// public TreeNode pre = null;
public void flatten(TreeNode root) {
if(root==null)
return;
注意在这里要注意写法情况,如果是写成
//if(root.left!=null)
flatten(root.left);
flatten(root.right);
// 如果右边没有的话直接返回
if(root.left==null) return;
TreeNode node= root.left;
while(node.right!=null) node =node.right;
node.right =root.right;
root.right = root.left;
root.left = null;
}
}
解法的解释说明) LeetCode 114. Flatten Binary Tree to Linked List - YouTube
错误的写法导致的空指针异常
class Solution {
// public TreeNode pre = null;
public void flatten(TreeNode root) {
if(root==null)
return;
if(root.left!=null) flatten(root.left);
if(root.right!=null) flatten(root.right);
TreeNode node= root.left;
while(node.right!=null) node =node.right;
node.right =root.right;
root.right = root.left;
root.left = null;
}
}
对上述代码进行改进的话就不会出现空指针异常
class Solution {
// public TreeNode pre = null;
public void flatten(TreeNode root) {
if(root==null)
return;
if(root.left!=null) flatten(root.left);
if(root.right!=null) flatten(root.right);
//加下面的判断,
if(root.left!=null) return;
TreeNode node= root.left;
while(node.right!=null) node =node.right;
node.right =root.right;
root.right = root.left;
root.left = null;
}
}
[参考链接方法] Flatten Binary Tree to Linked List 将二叉树展开成链表 - Grandyang - 博客园](http://www.cnblogs.com/grandyang/p/4293853.html)
非递归处理方法
public void flatten(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stk = new Stack<TreeNode>();
stk.push(root);
while (!stk.isEmpty()){
TreeNode curr = stk.pop();
if (curr.right!=null)
stk.push(curr.right);
if (curr.left!=null)
stk.push(curr.left);
if (!stk.isEmpty())
curr.right = stk.peek();
curr.left = null; // dont forget this!!
}
}
先让两边的情况都符合情况