vlambda博客
学习文章列表

实现二叉树的创建和遍历

创建

C Code

 /*按照前序输入二叉树中结点的值,#表示空树*/
 void CreateBiTree(BiTree *T) /*定义结构指针变量*/
 {
     TElemType ch;
     scanf("%c",&ch);
     if (ch == '#')
         *T = NULL;
     else
    {
         *T = (BiTree) malloc (sizeof(BiTNode));
         if (!*T)
             exit (OVERFLOW);
        (*T) -> data=ch;  /*生成根结点*/
         CreateBiTree(&(*T)->lchild); /*构建左子树*/
         CreateBiTree(&(*T)->rchild); /*构建右子树*/
    }
 }

Python Code

 class Nodes:
     #结点生成,先初始化
     def __init__(self, item):
         self.item = item
         self.lchild = None
         self.rchild = None
 
 class BiTree:
     #初始化root为None
     def __init__(self,node=None):
         self.root = node
     
     def addnode(self,item):
         #如果根节点为None,则将第一个接收到的值赋给根结点
         if self.root is None:
             self.root = Nodes(item)
         else:
             #否则将其添加到结点列表中,作为子结点
             nodelist = list()
             nodelist.append(self.root)
             while len(nodelist) > 0:
                 node = nodelist.pop(0)
                 #先添加左子树
                 if not node.lchild:
                     node.lchild = Nodes(item)
                     return
                 else:
                     nodelist.append(node.lchild)
 
                 #再添加右子树
                 if not node.rchild:
                     node.rchild = Nodes(item)
                     return
                 else:
                     nodelist.append(node.rchild)
                     
 if __name__ == '__main__':
     tree = BiTree()
     node_data = input('输入树的结点数据:').split(',')
     for i in node_data:
         tree.addnode(i)
         
     print(tree.root.lchild.rchild.item)  #测试,寻找root的左子树结点的右子树结点
     print(tree.root.lchild.lchild.rchild.item) #测试,寻找root的左子树结点的左子树结点的右子树结点

将没有的结点用^进行填充,代表空。模拟创建一下树结构:

通过以下内容查找对应的输出

 print(tree.root.lchild.rchild.item)  #寻找root的左子树结点的右子树结点
 print(tree.root.lchild.lchild.rchild.item) #寻找root的左子树结点的左子树结点的右子树结点

实现二叉树的创建和遍历



搜索二叉树

前序、中序、后序的搜索用到了递归的方法。通过调整左子树、右子树、root的前后遍历顺序来实现。

C Code

 /*前序*/
 void PreOrderTraverse(BiTree T)
 {
     if (T == NULL)
         return;
     printf("%c",T->data);
     PreOrderTraverse(T->lchild); /*左树*/
     PreOrderTraverse(T->rchild);/*右树*/
 }
 
 /*中序*/
 void InOrderTraverse(BiTree T)
 {
     if (T == NULL)
         return;
     InOrderTraverse(T->lchild); /*左树*/
     printf("%c",T->data);
     InOrderTraverse(T->rchild);/*右树*/
 }
 
 /*后序*/
 void PostOrderTraverse(BiTree T)
 {
     if (T == NULL)
         return;
     PostOrderTraverse(T->lchild); /*左树*/
     PostOrderTraverse(T->rchild);/*右树*/
     printf("%c",T->data);
 }

Python Code

 class SearchTree:
     '''以下方法都定义了return值。
        如果不定义return值,在调用该方法再一次进行print,则末尾会打印出一个多余的None值。
        相当于程序自动在末尾添加了一个 return None,所以需要指定返回值
    '''
 
     #使用list将结果存储起来,初始化的时候定义一下
     def __init__(self):
         self.preorder = []
         self.inorder = []
         self.postorder = []
 
     #前序
     def preorder_travel(self, root):
         if root is not None:
             self.preorder.append(root.item)
             self.preorder_travel(root.lchild)
             self.preorder_travel(root.rchild)
         return self.preorder  
 
     #中序
     def inorder_travel(self, root):
         if root is not None:
             self.inorder_travel(root.lchild)
             self.inorder.append(root.item)
             self.inorder_travel(root.rchild)
         return self.inorder
         
     #后序
     def postorder_travel(self, root):
         if root is not None :
             self.postorder_travel(root.lchild)
             self.postorder_travel(root.rchild)
             self.postorder.append(root.item)
         return self.postorder
     
 if __name__ == '__main__':
     nodes = SearchTree()
     print(nodes.preorder_travel(tree.root))
     print(nodes.inorder_travel(tree.root))
     print(nodes.postorder_travel(tree.root))

由于之前用^替代了空结点,所以在程序遍历的时候,会输出该符号,即下面标红的部分。实际处理时,需要将^忽略。(所以实际的查找中跳过红色步骤,按照绿色线条进行)