题目描述: 给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空,将此二叉树上下翻转并将它变成一棵树, 原来的右节点将转换成左叶节点。返回新的根。
例子: 输入: [1,2,3,4,5] 输出: 返回二叉树的根 [4,5,2,#,#,3,1] 说明: 对 [4,5,2,#,#,3,1] 感到困惑? 下面详细介绍请查看 二叉树是如何被序列化的。 二叉树的序列化遵循层次遍历规则,当没有节点存在时,’#’ 表示路径终止符。 这里有一个例子: 上面的二叉树则被序列化为 [1,2,3,#,#,4,#,#,5].
方法1: 主要思路: (1)迭代实现;
/** * 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: TreeNode* upsideDownBinaryTree(TreeNode* root) { TreeNode* parent=NULL; TreeNode* parent_right=NULL; while(root){ //刚好是一个首尾循环 TreeNode* root_left=root->left; root->left=parent_right; parent_right=root->right; root->right=parent; parent=root; root=root_left; } return parent;//返回 } };方法2: 主要思路: (1)递归; (2)将左子树进行递归,获得左子树的最终结果; (3)将左子树的最右边的叶子结点连接上根节点和右子树; (4)将根节点的左右子树置为空;
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* upsideDownBinaryTree(TreeNode* root) { //终止条件 if(root==nullptr||root->left==nullptr){ return root; } //左子树获得结果 TreeNode* new_root=upsideDownBinaryTree(root->left); TreeNode* tmp_root=new_root; //获得左子树的最右边的结点 while(tmp_root->right){ tmp_root=tmp_root->right; } //将最右边的结点连接上根节点和右子树 tmp_root->left=root->right; tmp_root->right=root; //置为空 root->left=nullptr; root->right=nullptr; return new_root; } };