赞
踩

给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。
样例输入:root = [1,2,5,3,4,null,6]
样例输出:[1,null,2,null,3,null,4,null,5,null,6]
void flatten(struct TreeNode* root){
}

前序遍历:先访问根结点,再前序遍历左子树,最后前序遍历右子树。
由于需要把所有结点都遍历一遍,所以时间复杂度为 O ( n ) O(n) O(n)。
struct TreeNode *head, *tail;
void preorder(struct TreeNode* root) { // (1)
struct TreeNode* now;
if(root) {
now = (struct TreeNode*) malloc( sizeof(struct TreeNode) );
now->val = root->val;
now->left = NULL;
now->right = NULL;
if (tail == NULL) { // (2)
head = tail = now;
}else {
tail->right = now;
tail = now;
}
preorder(root->left); // (3)
preorder(root->right); // (4)
}
}
void flatten(struct TreeNode* root){
if(root == NULL) {
return ; // (5)
}
head = tail = NULL;
preorder(root);
root->val = head->val; // (6)
root->left = NULL;
root->right = head->right;
}
递归时处理二叉树问题很好的手段。

相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。