我的一开始思路是先将root按照先序遍历输出到一个queue中,然后依次处理其节点,记得要把left节点置为NULL。程序比较简单,易懂。
C++代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
void flatten(TreeNode *root) {
if (root == NULL){
return ;
}
std::queue<TreeNode*> queueNode ;
push(queueNode,root);
TreeNode *temp=queueNode.front();
queueNode.pop();
pop(queueNode,temp);
}
void pop(std::queue<TreeNode*>&queueNode, TreeNode* pr){
if (queueNode.empty()){
return;
}
TreeNode *temp=queueNode.front();
queueNode.pop();
pr->right = temp;
pr->left =NULL;
pop(queueNode,temp);
}
void push(std::queue<TreeNode*>&queueNode,TreeNode* node){
if (node == NULL)
return ;
queueNode.push(node);
push(queueNode,node->left);
push(queueNode,node->right);
}
};
另外,我在网上也找到了一个好的循环代码,他的思想是通过找到root的左子树的最后一个要遍历的元素pre和root的右子树的第一个要遍历的元素root->right;然后整理一下树的结构,不断移动root完成任务。
C++代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
void flatten(TreeNode *root) {
if (root == NULL){
return ;
}
while(root){
TreeNode * pre = root->left;
if (pre){
while(pre->right){
pre = pre->right;
}
pre->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
};