Python: tree data structure

# 树结构
from pythonds.basic.stack import Stack  #pip install pythonds
from pythonds.trees.binaryTree import BinaryTree 
from collections import defaultdict
import json

#JSON-esque
def tree(): 
    return defaultdict(tree)

def dicts(t): 
    return {k: dicts(t[k]) for k in t}

#迭代
def add(t, keys):   
    for key in keys:     t = t[key]

users = tree();
users['harold']['username'] = 'hrldcpr' 
users['handler']['username'] = 'matthandlersux';

print(json.dumps(users));

taxonomy = tree(); 
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Felis']['cat'] 
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Panthera']['lion'] 
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['dog'] 
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['coyote'] 
taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['tomato'] 
taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['potato'] 
taxonomy['Plantae']['Solanales']['Convolvulaceae']['Ipomoea']['sweet potato']

print(dicts(taxonomy));

dtstr=add(taxonomy,'Animalia,Chordata,Mammalia,Cetacea,Balaenopteridae,Balaenoptera,blue whale'.split(','))





def buildParseTree(fpexp):
  fplist = fpexp.split()
  pStack = Stack()
  eTree = BinaryTree('')
  pStack.push(eTree)
  currentTree = eTree
  for i in fplist:
    if i == '(':
      currentTree.insertLeft('')
      pStack.push(currentTree)
      currentTree = currentTree.getLeftChild()
    elif i not in ['+', '-', '*', '/', ')']:
      currentTree.setRootVal(int(i))
      parent = pStack.pop()
      currentTree = parent
    elif i in ['+', '-', '*', '/']:
      currentTree.setRootVal(i)
      currentTree.insertRight('')
      pStack.push(currentTree)
      currentTree = currentTree.getRightChild()
    elif i == ')':
      currentTree = pStack.pop()
    else:
      raise ValueError
  return eTree

pt = buildParseTree("( ( 10 + 5 ) * 3 )")
pp= pt.postorder() #defined and explained in the next section

 

 

输出结果:

{"harold": {"username": "hrldcpr"}, "handler": {"username": "matthandlersux"}}
{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Felidae': {'Panthera': {'lion': {}}, 'Felis': {'cat': {}}}, 'Canidae': {'Canis': {'dog': {}, 'coyote': {}}}}}}}, 'Plantae': {'Solanales': {'Convolvulaceae': {'Ipomoea': {'sweet potato': {}}}, 'Solanaceae': {'Solanum': {'tomato': {}, 'potato': {}}}}}}
10
5
+
3
*
('In', 'the')
('the', 'beginning')
('beginning', 'god')
('god', 'created')
('created', 'the')
('the', 'heaven')
('heaven', 'and')
('and', 'the')
('the', 'earth')
('earth', '.')
涂聚文,geovindu
geovindu-PC
192.168.20.210
hello word 你好,世界
win32
1267650600228229401496703205376
输入的内容:

 

 2.

import uuid;

#Python3.5

class TreeNode(object):
    def __init__(self, data = -1, lchild = None, rchild = None):
        self.data = data
        self.lchild = lchild
        self.rchild = rchild

class BinaryTree(object):
    def __init__(self):
        self.root = TreeNode()

    def add(self, data):
        node = TreeNode(data)
        if self.isEmpty():
            self.root = node
        else:
            tree_node = self.root
            queue = []
            queue.append(self.root)

            while queue:
                tree_node = queue.pop(0)
                if tree_node.lchild == None:
                    tree_node.lchild = node
                    return
                elif tree_node.rchild == None:
                    tree_node.rchild = node
                    return
                else:
                    queue.append(tree_node.lchild)
                    queue.append(tree_node.rchild)

    def pre_order(self, start):
        node = start
        if node == None:
            return

        print(node.data),
        if node.lchild == None and node.rchild == None:
            return
        self.pre_order(node.lchild)
        self.pre_order(node.rchild)

    def pre_order_loop(self):
        if self.isEmpty():
            return

        stack = []
        node = self.root
        while node or stack:
            while node:
                print(node.data),
                stack.append(node)
                node = node.lchild
            if stack:
                node = stack.pop()
                node = node.rchild

    def in_order(self, start):
        node = start
        if node == None:
            return
        self.in_order(node.lchild)
        print(node.data),
        self.in_order(node.rchild)

    def in_order_loop(self):
        if self.isEmpty():
            return
        
        stack = []
        node = self.root
        while node or stack:
            while node:
                stack.append(node)
                node = node.lchild

            if stack:
                node = stack.pop()
                print(node.data),
                node = node.rchild

    def post_order(self, start):
        node = start
        if node == None:
            return
        self.post_order(node.lchild)
        self.post_order(node.rchild)
        print(node.data),

    
    def post_order_loop(self):
        if self.isEmpty():
            return
        
        node = self.root
        stack = []
        queue = []
        queue.append(node)
        while queue:
            node = queue.pop()
            if node.lchild:
                queue.append(node.lchild)
            if node.rchild:
                queue.append(node.rchild)
            stack.append(node)
        while stack:
            print(stack.pop().data),

    #if lchild and rchild are None or lchild and rchild are printed, print the parent node node and pop out of the stack
    #else lchild and rchild push into the stack
    def post_order_loop1(self):
        if self.isEmpty():
            return

        stack = []
        top = -1
        node = self.root
        stack.append(node)
        #we need to recognize the last printed node
        top += 1
        pre = None
        while stack:
            node = stack[-1]
            if node.lchild is None and node.rchild is None:
                print(node.data),
                pre = node
                top -= 1
            elif not pre and (node.lchild == pre or node.rchild == pre):
                print(node.data),
                pre = node
                top -= 1
            else:
                if node.rchild:
                    if top < len(stack)-1:
                        stack[top] = node.rchild
                    else:
                        stack.append(node.rchild)
                if node.lchild:
                    if top < len(stack)-1:
                        stack[top] = node.lchild
                    else:
                        stack.append(node.lchild)

    def level_order(self):
        node = self.root
        if node == None:
            return
        
        queue = []
        queue.append(node)

        while queue:
            node = queue.pop(0)
            print(node.data),
            if node.rchild:
                queue.append(node.rchild)
            if node.lchild:
                queue.append(node.lchild)
        print

    def isEmpty(self):
        return True if self.root.data == -1 else False


class NodeTu:
     def __init__(self, value, next=None):
            self.value = value;
            self.next = next;

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

  测试:

import nltk;
import pandas;
import matplotlib;
import math;
import os;
import unittest;
#from nltk.parse.featurechart import trees
import NodeDu;
import copy;
import NodeTu;
import TreeNode;
from nltk.tree import ParentedTree;

#Python 3.5


#from platform import node


#1. tree data structure
arr = []
for i in range(10):
        arr.append(i)
print(arr);

tree =TreeNode.BinaryTree();
for i in arr:
        tree.add(i)
print('level_order:');
tree.level_order();
print('pre order:');
tree.pre_order(tree.root)
print('\npre order loop:');
tree.pre_order_loop()
print('\nin_order:');
tree.in_order(tree.root)
print('\nin_order loop:');
tree.in_order_loop()
print('\npost_order:');
tree.post_order(tree.root)
print('\npost_order_loop:');
tree.post_order_loop()
print('\npost_order_loop1:');
tree.post_order_loop1()


a11=NodeTu.NodeTu(6);
a12=NodeTu.NodeTu(5);
a13=NodeTu.NodeTu(4);
a14=NodeTu.NodeTu(3);
a15=NodeTu.NodeTu(2);

a12=a11.next;
a13=a14.next;
a14=a15.next;


a16=a11.next;

print(a15.value);
print(a11.value);



a1 = NodeDu.NodeDu(6);
b1 = NodeDu.NodeDu(5);
b2 = NodeDu.NodeDu(2);
c1 = NodeDu.NodeDu(4);
c2 = NodeDu.NodeDu(1);
c3 = NodeDu.NodeDu(1);
d1 = NodeDu.NodeDu(3);
d2 = NodeDu.NodeDu(0); 

a1.left = b1;
a1.right = b2;
b1.left = c1;
b1.right = c2;
b2.left = c3;
c1.left = d1;
c1.right = d2;

s = [];

def gos(node, path=[]):
    if node:
        path.append(node.value)
        if node.left:
            path1 = copy.copy(path)
            gos(node.left, path1)
            if node.right:
                path2 = copy.copy(path)
                gos(node.right, path2)
        else:
            s.append(copy.copy(path))

gos(a1);
print(s); 

#
ptree = ParentedTree.fromstring('(ROOT (S (NP (JJ Congressional) \
    (NNS representatives)) (VP (VBP are) (VP (VBN motivated) \
    (PP (IN by) (NP (NP (ADJ shiny) (NNS money))))))) (. .))')

def traverse(t):
    try:
        t.label()
    except AttributeError:
        return
    else:
        if t.height() == 2:   #child nodes
            print(t.parent());
            return

        for child in t:
            traverse(child)

tra=traverse(ptree);
print(tra);

ptree = ParentedTree.fromstring('(ROOT (S (NP (PRP It)) \
        (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))')

leaf_values = ptree.leaves();

if 'nice' in leaf_values:
    leaf_index = leaf_values.index('nice')
    tree_location = ptree.leaf_treeposition(leaf_index)
    print(tree_location);
    print(ptree[tree_location]);

  输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
level_order:
0
2
1
6
5
4
3
9
8
7
pre order:
0
1
3
7
8
4
9
2
5
6

pre order loop:
0
1
3
7
8
4
9
2
5
6

in_order:
7
3
8
1
9
4
0
5
2
6

in_order loop:
7
3
8
1
9
4
0
5
2
6

post_order:
7
8
3
9
4
1
5
6
2
0

post_order_loop:
7
8
3
9
4
1
5
6
2
0

post_order_loop1:

  https://repo.continuum.io/archive/.winzip/

https://github.com/Rochester-NRT/RocAlphaGo

https://github.com/wrongu/

https://github.com/hiropppe/

https://gitter.im/Rochester-NRT/RocAlphaGo

http://www.nltk.org/nltk_data/

 

posted @ 2017-01-17 15:04  ®Geovin Du Dream Park™  阅读(1328)  评论(0编辑  收藏  举报