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