1.描述
深度复制一个二叉树。
给定一个二叉树,返回一个他的克隆品 。
哪家公司问你的这个题?
Airbnb Alibaba Amazon Apple Baidu Bloomberg Cisco Dropbox Ebay Facebook Google Hulu Intel Linkedin Microsoft NetEase Nvidia Oracle Pinterest Snapchat Tencent Twitter Uber Xiaomi Yahoo Yelp Zenefits
感谢您的反馈
样例
给定一个二叉树:
1
/ \
2 3
/ \
4 5
返回其相同结构相同数值的克隆二叉树:
1
/ \
2 3
/ \
4 5
2.分析
克隆一个二叉树,即结构相同数值相同,父母和孩子的关系不变,对应位置的节点不变。
因此首先建立一个新节点作为克隆二叉树的根节点,之后访问原二叉树的左子树利用节点值
新建一个节点作为克隆二叉树根节点的左子树,右子树也是如此。
3.代码
/**
* 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: The root of binary tree
* @return root of new tree
*/
TreeNode *dummy;
void clone(TreeNode *root,TreeNode *dummy)
{
if(root==NULL) return ;
if(root->left!=NULL)//若原二叉树有左孩子
{
TreeNode *temp;
temp=new TreeNode(root->left->val);//用原二叉树当前节点的左孩子的节点值新建一个节点作为克隆二叉树当前节点的左孩子
dummy->left=temp;
clone(root->left,dummy->left);
}
else//若原二叉树的当前节点没有左孩子,则克隆二叉树当前节点的左孩子为空
{
dummy->left=NULL;
clone(root->left,dummy->left);
}
if(root->right!=NULL)//下面对右子树的操作和上面对左子树的操作相仿
{
TreeNode *temp;
temp=new TreeNode(root->right->val);
dummy->right=temp;
clone(root->right,dummy->right);
}
else
{
dummy->right=NULL;
clone(root->right,dummy->right);
}
}
TreeNode* cloneTree(TreeNode *root) {
// Write your code here
if(root==NULL) return NULL;
dummy=new TreeNode(root->val);//用原二叉树的节点值新建一个节点作为克隆二叉树的根节点
clone(root,dummy);//首先用到两个二叉树的根节点
return dummy;
}
};
* 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: The root of binary tree
* @return root of new tree
*/
TreeNode *dummy;
void clone(TreeNode *root,TreeNode *dummy)
{
if(root==NULL) return ;
if(root->left!=NULL)//若原二叉树有左孩子
{
TreeNode *temp;
temp=new TreeNode(root->left->val);//用原二叉树当前节点的左孩子的节点值新建一个节点作为克隆二叉树当前节点的左孩子
dummy->left=temp;
clone(root->left,dummy->left);
}
else//若原二叉树的当前节点没有左孩子,则克隆二叉树当前节点的左孩子为空
{
dummy->left=NULL;
clone(root->left,dummy->left);
}
if(root->right!=NULL)//下面对右子树的操作和上面对左子树的操作相仿
{
TreeNode *temp;
temp=new TreeNode(root->right->val);
dummy->right=temp;
clone(root->right,dummy->right);
}
else
{
dummy->right=NULL;
clone(root->right,dummy->right);
}
}
TreeNode* cloneTree(TreeNode *root) {
// Write your code here
if(root==NULL) return NULL;
dummy=new TreeNode(root->val);//用原二叉树的节点值新建一个节点作为克隆二叉树的根节点
clone(root,dummy);//首先用到两个二叉树的根节点
return dummy;
}
};
4.总结
由于两个二叉树具有相同的结构,因此双方同时操作的节点也应该是相对应的。双方的双亲节点相对应,
因此原二叉树的子树也和克隆二叉树的子树相同,取原二叉树的孩子的节点值新建克隆二叉树孩子的节点。
注意若原二叉树的某个孩子为空,这时候是没有节点值的,此时克隆二叉树的对应位置也为空。