本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:liuyuan_jq
2011-07-14
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
二元树结点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12和10, 5, 7。 二元树结点的数据结构定义为: struct BinaryTreeNode // a node in the binary tree { int m_nValue; // value of node BinaryTreeNode *m_pLeft; // left child of node BinaryTreeNode *m_pRight; // right child of node }; 分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。 当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。 如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。 如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。 因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。 我们不难看出保存路径的数据结构实际上是一个栈结构, 因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。 """ class TreeNode(object): def __init__(self, value, leftNode = None, rightNode = None): self.m_nValue = value self.m_pLeft = leftNode self.m_pRight = rightNode def __cmp__(self, other): if self.m_nValue == other.m_nValue: return 0 elif self.m_nValue < other.m_nValue: return -1 else: return 1 class Tree(object): def __init__(self, values = None): self.rootNode = None self.values = values if values: # 递归创建二叉树 self.rootNode = self.create(values, 1) def create(self, values, position = 1): """ 递归创建二叉树 """ if position > len(values): return None newNode = TreeNode(values[position - 1]) newNode.m_pLeft = self.create(values, position * 2) newNode.m_pRight = self.create(values, position * 2 + 1) return newNode def _dump(self, node): """ 中序递归遍历 """ if node: self._dump(node.m_pLeft) print node.m_nValue self._dump(node.m_pRight) def dump(self): self._dump(self.rootNode) def _getpath(self, value, node, path=[]): """ 递归获得指定路径 """ # 递归结束条件 if not node: return path.append(node.m_nValue) # 获得指定路径 topValue = node.m_nValue if node.m_pLeft is None and node.m_pRight is None: if value == topValue: print path # 递归 self._getpath(value - topValue, node.m_pLeft, path) self._getpath(value - topValue, node.m_pRight, path) path.pop() def getPath(self, value): return self._getpath(value, self.rootNode) if __name__ == '__main__': values = [10, 5, 12, 4, 7] #values = [1,2] tree = Tree(values) tree.dump() #打印出两条路径:10, 12和10, 5, 7 print tree.getPath(22)