python树形搜索_Python:使用列表创建二进制搜索树

本文介绍如何通过Python读取文本文件,将单词拆分并存储到列表中,然后创建二叉搜索树统计单词频率。挑战在于如何将每个单词插入独立节点而非整个列表。作者提供了一个递归实现的二叉树结构,用于插入、搜索和打印节点,适合初学者理解。
摘要由CSDN通过智能技术生成

The objective of my code is to get each seperate word from a txt file and put it into a list and then making a binary search tree using that list to count the frequency of each word and printing each word in alphabetical order along with its frequency. Each word in the can only contain letters, numbers, -, or ' The part that I am unable to do with my beginner programming knowledge is to make the Binary Search Tree using the list I have (I am only able to insert the whole list in one Node instead of putting each word in a Node to make the tree). The code I have so far is this:

def read_words(filename):

openfile = open(filename, "r")

templist = []

letterslist = []

for lines in openfile:

for i in lines:

ii = i.lower()

letterslist.append(ii)

for p in letterslist:

if p not in ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',"'","-",' '] and p.isdigit() == False:

letterslist.remove(p)

wordslist = list("".join(letterslist).split())

return wordslist

class BinaryTree:

class _Node:

def __init__(self, value, left=None, right=None):

self._left = left

self._right = right

self._value = value

self._count = 1

def __init__(self):

self.root = None

def isEmpty(self):

return self.root == None

def insert(self, value) :

if self.isEmpty() :

self.root = self._Node(value)

return

parent = None

pointer = self.root

while (pointer != None) :

if value == pointer._value:

pointer._count += 1

return

elif value < pointer._value:

parent = pointer

pointer = pointer._left

else :

parent = pointer

pointer = pointer._right

if (value <= parent._value) :

parent._left = self._Node(value)

else :

parent._right = self._Node(value)

def printTree(self):

pointer = self.root

if pointer._left is not None:

pointer._left.printTree()

print(str(pointer._value) + " " + str(pointer._count))

if pointer._right is not None:

pointer._right.printTree()

def createTree(self,words):

if len(words) > 0:

for word in words:

BinaryTree().insert(word)

return BinaryTree()

else:

return None

def search(self,tree, word):

node = tree

depth = 0

count = 0

while True:

print(node.value)

depth += 1

if node.value == word:

count = node.count

break

elif word < node.value:

node = node.left

elif word > node.value:

node = node.right

return depth, count

def main():

words = read_words('sample.txt')

b = BinaryTree()

b.insert(words)

b.createTree(words)

b.printTree()

解决方案

Since you're a beginner I'd advice to implement the tree methods with recursion instead of iteration since this will result to simpler implementation. While recursion might seem a bit difficult concept at first often it is the easiest approach.

Here's a draft implementation of a binary tree which uses recursion for insertion, searching and printing the tree, it should support the functionality you need.

class Node(object):

def __init__(self, value):

self.value = value

self.left = None

self.right = None

self.count = 1

def __str__(self):

return 'value: {0}, count: {1}'.format(self.value, self.count)

def insert(root, value):

if not root:

return Node(value)

elif root.value == value:

root.count += 1

elif value < root.value:

root.left = insert(root.left, value)

else:

root.right = insert(root.right, value)

return root

def create(seq):

root = None

for word in seq:

root = insert(root, word)

return root

def search(root, word, depth=1):

if not root:

return 0, 0

elif root.value == word:

return depth, root.count

elif word < root.value:

return search(root.left, word, depth + 1)

else:

return search(root.right, word, depth + 1)

def print_tree(root):

if root:

print_tree(root.left)

print root

print_tree(root.right)

src = ['foo', 'bar', 'foobar', 'bar', 'barfoo']

tree = create(src)

print_tree(tree)

for word in src:

print 'search {0}, result: {1}'.format(word, search(tree, word))

# Output

# value: bar, count: 2

# value: barfoo, count: 1

# value: foo, count: 1

# value: foobar, count: 1

# search foo, result: (1, 1)

# search bar, result: (2, 2)

# search foobar, result: (2, 1)

# search bar, result: (2, 2)

# search barfoo, result: (3, 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值