摘要:树在数据结构还是很重要的,这里表示二叉树用括号表示法表示。先写一个二叉树节点类二叉树节点然后构造二叉树指针这里写上一个打印二叉树的函数中序遍历运行结果输入一个字符串语言实现中序遍历
树(Tree)在数据结构还是很重要的,这里表示二叉树用括号表示法表示。
先写一个二叉树节点类:
// 二叉树节点 class BTNode { public $data; public $lchild = NULL; public $rchild = NULL; public function __construct($data) { $this->data = $data; } }
然后构造二叉树:
function CreateBTNode(BTNode &$root = NULL, string $str) { $strArr = str_split($str); $stack = []; $p = NULL; // 指针 $top = -1; $k = $j = 0; $root = NULL; foreach ($strArr as $ch) { switch ($ch) { case "(": $top++; array_push($stack, $p); $k = 1; break; case ")": array_pop($stack); break; case ",": $k = 2; break; default: $p = new BTNode($ch); if($root == NULL) { $root = $p; } else { switch ($k) { case 1: end($stack)->lchild = $p; break; case 2: end($stack)->rchild = $p; break; } } break; } } }
这里写上一个打印二叉树的函数(中序遍历):
function PrintBTNode($node) { if($node != NULL) { PrintBTNode($node->lchild); echo $node->data; PrintBTNode($node->rchild); } }
运行结果:
输入一个字符串
"A(B(C,D),G(F))"
package main import ( "fmt" "strings" ) type BinaryTreeNode struct { data string lChild *BinaryTreeNode rChild *BinaryTreeNode } func CreateBinaryTree(sequence string) *BinaryTreeNode { words := strings.Split(sequence, "") stack := []*BinaryTreeNode{} var p *BinaryTreeNode = nil top := -1 k := 0 var root *BinaryTreeNode = nil for _, word := range words { switch word { case "(": top++ stack = append(stack, p) k = 1 case ")": stack = stack[0:top] top-- k = 0 case ",": k = 2 default: p = &BinaryTreeNode{ word, nil, nil, } if root == nil { root = p } else { endItem := stack[top] switch k { case 1: endItem.lChild = p case 2: endItem.rChild = p } } } } return root } // 中序遍历 func inOrderBinaryTree(root *BinaryTreeNode) { if root != nil { inOrderBinaryTree(root.lChild) fmt.Print(root.data) inOrderBinaryTree(root.rChild) } } func main() { testStr := "A(B(C,D),G(F))" root := CreateBinaryTree(testStr) inOrderBinaryTree(root) }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/23113.html
摘要:树的前序,中序遍历的结构如下图可以看出,通过前序遍历可以确定根节点,再通过中序遍历和根节点的位置可以确定出左子树和右子树。另外左子树的前序遍历和中序遍历的顺序跟在其父树中的顺序一样。因此可以确定有一种递归解法。 从前序与中序遍历序列构造二叉树 今天带来的是Leetcode上的一个经典题:从前序与中序遍历序列构造二叉树原题干: /** Definition for a binary ...
摘要:二叉搜索树的特性二叉搜索树由于其独特的数据结构,使得其无论在增删,还是查找,时间复杂度都是,为二叉树的高度。二叉搜索树的查找查找很简单,根据左子节点比该节点小,右子节点比该节点大的原则进行循环判断即可。 什么是二叉树 二叉树就是树的每个节点最多只能有两个子节点 什么是二叉搜索树 二叉搜索树在二叉树的基础上,多了一个条件,就是二叉树在插入值时,若插入值比当前节点小,就插入到左节点,否则插...
摘要:回来更新一波,最近刷剑指,才又发现树真是一个大头,二叉树的题目和变化运用好多啊二叉树算法引子很多人说二叉树没什么卵用,我觉得是他的工资和公司让他跨不过这个坎还有很多人学了一些树的知识,发现也用不上,我想说的是,读一本书体现不了这本书 回来更新一波,最近刷《剑指offer》,才又发现树真是一个大头,二叉树的题目和变化运用好多啊~ /** * PHP二叉树算法 * Create...
摘要:回来更新一波,最近刷剑指,才又发现树真是一个大头,二叉树的题目和变化运用好多啊二叉树算法引子很多人说二叉树没什么卵用,我觉得是他的工资和公司让他跨不过这个坎还有很多人学了一些树的知识,发现也用不上,我想说的是,读一本书体现不了这本书 回来更新一波,最近刷《剑指offer》,才又发现树真是一个大头,二叉树的题目和变化运用好多啊~ /** * PHP二叉树算法 * Create...
阅读 529·2023-04-25 14:26
阅读 1284·2021-11-25 09:43
阅读 3475·2021-09-22 15:25
阅读 1446·2019-08-30 15:54
阅读 517·2019-08-30 12:57
阅读 764·2019-08-29 17:24
阅读 3165·2019-08-28 18:13
阅读 2671·2019-08-28 17:52