内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

黄哥Python 2018-1-9出的练习题

2018-01-11 17:46 出处:清屏网 人气: 评论(0

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

 

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

任意节点的左、右子树也分别为二叉查找树;

没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。

 

二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的复杂度等于树高,期望 {\displaystyle O(\log n)} O(\log n),最坏 {\displaystyle O(n)} O(n)(数列有序,树退化成线性表)。

 

虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为 {\displaystyle O(\log n)} O(\log n),如SBT,AVL树,红黑树等。故不失为一种好的动态查找方法。

 

以上内容来自维基百科。

下面是黄哥写的Go 代码,实现了二叉树循环和递归插入,中序遍历。请大家修改为Python 代码实现一遍。

package main

import "fmt"

type Node struct {
	data  int
	left  *Node
	right *Node
}

// 循环插入
func insertByLoop(t *Node, number int) {
	node := &Node{
		data: number,
	}
	temp := t
	for {
		if number < temp.data {

			if temp.left != nil {
				temp = temp.left

			} else if temp.left == nil {
				temp.left = node
				break
			}

		} else if number >= temp.data {

			if temp.right != nil {
				temp = temp.right
			} else if temp.right == nil {
				temp.right = node
				break
			}

		}

	}
}

// 递归插入
func insertByRecursion(t *Node, number int) {
	node := &Node{
		data: number,
	}
	temp := t

	if temp == nil {
		return
	}

	if number < temp.data {
		if temp.left == nil {
			temp.left = node
		} else {
			insertByRecursion(temp.left, number)
		}

	} else {
		if temp.right == nil {
			temp.right = node
		} else {
			temp = temp.right
			insertByRecursion(temp, number)
		}

	}

}

// 中序遍历
func traverseTree(root *Node) {
	if root == nil {
		return
	}
	traverseTree(root.left)
	fmt.Println(root.data)
	traverseTree(root.right)
}

func main() {
	head := &Node{
		data:  8,
		left:  nil,
		right: nil,
	}

	input1 := []int{2, 3, 7, 12, 34, 9, 6}
	for _, value := range input1 {
		insertByRecursion(head, value)
	}

	input2 := []int{5, 10, 23, 15}
	for _, value := range input2 {
		insertByLoop(head, value)
	}

	traverseTree(head)
}
分享给小伙伴们:
本文标签: Python

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号