leetcode Flatten Binary Tree to Linked List
题目:给定一个棵树,将其转换成flattened tree。只有右节点的,类似于链表,且在原址操作。
例如:
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
根据提示发现flattened tree是按照前序遍历顺序排列的。
这题难度在于在原址操作,否则,中序遍历一下,构造一个树就可以了。
我是用递归的思想,一个子函数将传入的root变为flattened tree,并且返回该flattened tree的末尾节点。那么我们只要对根节点的左边做一个子函数处理,右边做一个子函数处理,然后把root的left赋值为right,将原来的right赋值为左边子函数处理后返回的末尾节点的right,就构造完成了。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode *Tree2ListEnd(TreeNode *root) { if (!root) return NULL; if (!root -> left && !root -> right) return root; if (!root -> left) return Tree2ListEnd(root -> right); if (!root -> right) { root -> right = root -> left; root -> left = NULL; // 记得将左边赋值空 return Tree2ListEnd(root -> right); } if (root -> left && root -> right) { TreeNode *ri = root -> right; root -> right = root -> left; root -> left = NULL; // 左边赋值空 TreeNode *riEnd = Tree2ListEnd(root -> right); riEnd -> right = ri; return Tree2ListEnd(riEnd -> right); // 剩下的部分也要处理 } } void flatten(TreeNode *root) { if (!root || !root->left && !root->right) return ; if (!root -> left) flatten(root -> right); else { TreeNode *lfEnd = Tree2ListEnd(root -> left); Tree2ListEnd(root -> right); TreeNode *ri = root -> right; root -> right = root -> left; root -> left = NULL; // 记得赋值空 lfEnd -> right = ri; } } };
需要注意的地方如注释所写。
还学习了别人的方法,学习之后是收获不少啊。大牛颇多:
[解题思路]
1 \
2
/ \
3 4
\ 5 \ 6
对root的左子树进行处理,将左子树的根节点和左子树的右子树插入右子树中
接下来对节点2进行处理,同样将2的左子树插入右子树中
/** * Definition for binary tree * 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) return ; if (!root -> left) return flatten(root -> right); else { TreeNode *ri = root -> right; TreeNode *lr = root -> left; while(lr -> right) { lr = lr -> right; } root -> right = root -> left; lr -> right = ri; root -> left = NULL; flatten(root -> right); } } };
这里有非递归。