题目描述:
给定一个二叉树根结点,复制该树,返回新建树的根结点。
思路:
用给定的二叉树的根结点root来构造新的二叉树的方法为,首先创建新的结点 dupTree,然后根据 root 结点来构造 dupTree 结点(dupTree.data=root.data),最后分别用 root 的左右子树来构造 dupTree的左右子树。
算法性能分析:
这种方法对给定的二叉树进行了一次遍历,所以时间复杂度为O(n);
因为新建结点来保存新的树所以空间复杂度为O(n);
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/26 9:40
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
class BiTNode:
def __init__(self):
self.data = None
self.lchild = None
self.rchild = None
def constructTree():
"""
构造二叉树
:return:
"""
root = BiTNode()
node1 = BiTNode()
node2 = BiTNode()
node3 = BiTNode()
node4 = BiTNode()
root.data = 6
node1.data = 3
node2.data = -7
node3.data = -1
node4.data = 9
root.lchild = node1
root.rchild = node2
node1.lchild = node3
node1.rchild = node4
node2.lchild = node2.rchild = node3.rchild = node3.lchild = \
node4.lchild = node4.rchild = None
return root
def createDupTree(root):
if root == None:
return
dupTree = BiTNode()
dupTree.data = root.data
dupTree.lchild = createDupTree(root.lchild) # 复制左子树
dupTree.rchild = createDupTree(root.rchild) # 复制右子树
return dupTree
def printTreeMidOrder(root):
if root == None:
return
if root.lchild != None:
printTreeMidOrder(root.lchild)
print(root.data, end=' ')
if root.rchild != None:
printTreeMidOrder(root.rchild)
if __name__ == '__main__':
root1 = constructTree()
root2 = createDupTree(root1)
print('mid order traverse before: ', end='')
printTreeMidOrder(root1)
print()
print('mid order traverse after: ', end='')
printTreeMidOrder(root2)
结果:
end