二叉树的一些操作的代码实现
来源:互联网 发布:软件开发编程培训 编辑:程序博客网 时间:2024/06/05 19:56
class TreeNode: def __init__(self, x): self.val = x self.left = None sele.right = None
较为直观的打印二叉树
def printTree(root): if not root: return print("Binary Tree: ") printInOrder(root, 0, 'H', 10)def printInOrder(root, height, preStr, length): if not root: return printInOrder(root.right, height+1, 'v', length) string = preStr + root.val + preStr leftLen = (length - len(string)) // 2 rightLen = length - len(string)- leftLen res = " "*leftLen + string + " "*rightLen print(" "*height*length + res) printInOrder(root.left, height+1, '^', length)
计算树的深度
def getDepth(root): if not root: return 0 return 1 + max(getDepth(root.left), getDepth(root.right))
计算树的带权路径长度
def getWPL(root, depth=0): if not root: return 0 if not root.left and not root.right: return depth * int(root.val) return getWPL(root.left, depth + 1) + getWPL(root.right, depth + 1)
打印二叉树的边界节点
给定一棵二叉树的头节点,按照如下两种标准分别实现二叉树边界节点的逆时针打印。
标准一:
- 头节点为边界节点
- 叶节点为边界节点
- 如果节点在其所在层中的最左边或最右边,那么也是边界节点
标准二:
- 头节点为边界节点
- 叶节点为边界节点
- 树左边界延伸下去的路径为边界节点
- 树右边界延伸下去的路径为边界节点
#标准一def printEdge1(root): def getHeight(root, height=0): if not root: return 0 return max(getHeight(root.left, height+1), getHeight(root.right, height+1)) + 1 def getMap(root, i, map): if not root: return if map[i][0] == None: map[i][0] = root map[i][1] = root getMap(root.left, i+1, map) getMap(root.right, i+1, map) def printLeafNotInMap(root, i, map): if not root: return if not root.left and not root.right and root != map[i][0] and \ root != map[i][1]: print(root.val, end=' ') printLeafNotInMap(root.left, i+1, map) printLeafNotInMap(root.right, i+1, map) if not root: return height = getHeight(root) map = [[None for i in range(2)] for j in range(height)] getMap(root, 0, map) for i in range(len(map)): print(map[i][0].val, end=' ') printLeafNotInMap(root, 0, map) for i in range(len(map)-1, -1, -1): if map[i][0] != map[i][1]: print(map[i][1].val, end=' ')
#标准二def printEdge2(root): def printLeft(root, isPrint): if not root: return if isPrint or (root.left == None and root.right == None): print(root.val, end=' ') printLeft(root.left, isPrint) printLeft(root.right, bool(isPrint and root.left == None)) def printRight(root, isPrint): if not root: return printRight(root.left, bool(isPrint and root.right == None)) printRight(root.right, isPrint) if isPrint or (root.left == None and root.right == None): print(root.val, end=' ') if not root: return print(root.val, end=' ') if root.left and root.right: printLeft(root.left, True) printRight(root.right, True) elif root.left: printEdge2(root.left) elif root.right: printEdge2(root.right)
二叉树的序列化和反序列化
说明:二叉树被记录成文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化
#二叉树的序列化和反序列化(先序)def serialByPre(root): if not root: return '#!' res = root.val + '!' res += serialByPre(root.left) res += serialByPre(root.right) return resdef reconByPreString(preStr): def reconPreOrder(values): key = values.pop(0) if key == '#': return None root = TreeNode(key) root.left = reconPreOrder(values) root.right = reconPreOrder(values) return root values = preStr.split('!') return reconPreOrder(values)
#二叉树的序列化和反序列化(层次)def serialByLevel(root): if root == '#': return '#!' stack = [] stack.append(root) res = root.val + '!' while stack: root = stack.pop() if root.left: res += root.left.val + '!' stack.append(root.left) else: res += '#!' if root.right: res += root.right.val + '!' stack.append(root.right) else: res += '#!' return resdef reconByLevelString(levStr): def generateNode(key): if key == '#': return None return TreeNode(key) values = levStr.split('!') head = generateNode(values.pop(0)) queue = [] if head: queue.append(head) while queue: root = queue.pop(0) root.left = generateNode(values.pop(0)) root.right = generateNode(values.pop(0)) if root.left: queue.append(root.left) if root.right: queue.append(root.right) return head
阅读全文
1 0
- 二叉树的一些操作的代码实现
- 有关二叉树操作的代码实现
- 二叉树的一些操作
- 二叉树的一些操作
- 二叉树的一些操作的C++实现。
- 二叉树的一些操作(C语言实现)
- 二叉树的一些实现
- 二叉搜索树的基本操作(C代码实现)
- 二叉树的基本操作 C++代码实现
- 有关树二叉树的一些操作
- 关于二叉树的一些操作
- 关于二叉树的一些操作
- PHP二叉树的一些操作练习
- 二叉搜索树的一些基本操作
- 二叉树的一些基本操作
- 二叉树的一些操作整理
- 二叉树的一些简单操作
- 二叉树的一些简单操作
- 开发技能-shell面试整理
- 【剑指offer】面试题34:二叉树中和为某一值的路径
- Regular polygon
- DC -16 :链式栈
- 链栈的主要操作
- 二叉树的一些操作的代码实现
- 桐桐的组合
- UVALive5402 UVA579 Clock Hands【水题】
- Ajax
- 使用CSDN Markdown在线编辑器写博客
- Java 设计模式_装饰器模式
- 屏幕适配、系统适配基础介绍
- java 8的流式操作与并行流
- DC--18 :头结点链表