1. 二叉树展开为链表
给定一个二叉树,原地将它展开为链表
思路:
- 非迭代版本
从根节点出发,先检测其左子节点是否存在,如果存在则将根节点和其右子节点断开,将左子节点及其后面所有结构一起练到原右子节点的位置,把原右子节点连到原左子节点最后面的右子节点之后。
void flatten(TreeNode* root) {
TreeNode* cur = root;
while(cur)
{
if(cur -> left)
{
TreeNode* p = cur -> left;
while(p -> right)
{
p = p -> right;
}
#p为左子树的最右边节点
p -> right = cur -> right;
cur -> right = cur -> left;
cur -> left = nullptr;
}
cur = cur -> right;
}
}
- 迭代版本
先找到最左子节点,然后返回其父节点,把其父节点和右子节点断开,将原左子节点连上父节点的右子节点上,再把原右子节点连到新右子节点的右子节点上
class Solution{
public:
void flatten(TreeNode *root){
if(root == nullptr)
{
return;
}
if(root -> left)
{
flatten(root -> left);
}
if(root -> right)
{
flatten(root -> right);
}
TreeNode* temp = root -> right;
root -> right = root -> left;
root -> left = nullptr;
while(root -> right)
{
root = root -> rigth;
}
root -> right = temp;
}
}
2. 填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树的定义如下:
struct Node{
int val;
Node* left;
Node* right;
Node* next;
}
填充它的每一个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NULL。
初始状态下,所有next指针都被设置为NULL。
Node* connect(Node* root) {
if(root == nullptr || root -> left == nullptr)
{
return root;
}
root -> left -> next = root -> right;
if(root -> next)
{
root -> right -> next = root -> next -> left;
}
connect(root -> left);
connect(root -> right);
return root;
}