PHP构造二叉树算法示例

树(Tree)在数据结构还是很重要的,这里表示二叉树用括号表示法表示。先写一个二叉树节点类:

// 二叉树节点 class BTNode { public $data; public $lchild = NULL; public $rchild = NULL; public function __construct($data) { $this->data = $data; } }

然后构造二叉树:

function CreateBTNode(&$root,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))"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2025-01-29 22:19:52

PHP构造二叉树算法示例的相关文章

数组构造二叉树并打印的编程算法

数组: 构造二叉树, 需要使用两个队列(queue), 保存子节点和父节点, 并进行交换; 打印二叉树, 需要使用两个队列(queue), 依次打印父节点和子节点, 并进行交换; 二叉树的数据结构: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pParent; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; 代码: /* * main.cpp * * Created o

C#语言怎么利用文本框构造二叉树?二叉树的构造也是靠递归么?

问题描述 C#语言怎么利用文本框构造二叉树?二叉树的构造也是靠递归么? C#语言怎么利用文本框构造二叉树?二叉树的构造也是靠递归么? 解决方案 http://www.cnblogs.com/yjmyzz/archive/2010/12/01/1892403.html 解决方案二: 利用广义表非递归构造二叉树二叉树的构造构造二叉树

VC实现五子棋游戏的一个算法示例_C 语言

本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善. 该设计主要包括:数据结构.估值函数.胜负判断.搜索算法 程序运行界面如下: 具体实现步骤如下: 1.数据结构 //记录每步棋,可以建立链表用来进行悔棋.后退(本程序没有实现) struct Step { int x,y; //棋子坐标 int ball; //表示下子方{BLACK,WHITE} }; //记录棋盘情况,用于搜索过程 class CBoardSitua

关于二叉树中根和后根构造二叉树求大神帮忙看看有没有什么问题?

问题描述 关于二叉树中根和后根构造二叉树求大神帮忙看看有没有什么问题? #include using namespace std; template class BinaryNode { public: T data; BinaryNode *left, *right; BinaryNode(T data, BinaryNode*left = NULL, BinaryNode*right = NULL) { this->data = data; this->left = left; this-

最优二叉树算法

练习做一下构造最优二叉树的算法,不过如何计算WPL呢? 本次未能实现,希望懂的人可以帮我解决一下这个问题,不胜感激! // // 头文件:HuffmanTree.h // // 叶子结点的最大数量 #define LEAVES_COUNT 4 // // 二叉树的最大结点总数 #define NODES_COUNT (2 * LEAVES_COUNT - 1) // // 哈夫曼树的结点结构体 typedef struct tagHuffmanTreeNode { float weight; /

折半查找(binary search) 算法示例

折半查找, 又称二分查找(binary search), 需要数组有序(sort), 通过比较数组的中间数据(中心偏向较小的方法), 确定查找值的范围; 直到中值等于查找值, 则查找成功; 如果未成功, 则重置数据, 判断首尾位置的大小, 再进行中值比较; 判断失败, 则数据不存在; 注意: 1. Eclipse无法重定向(redirect)输入文件(file), 只能读入数据; 2. 使用cmd重定向输入文件, 则需要解压"stdlib.jar", 取出相应的class(In, Ou

线索二叉树算法

#include <stdio.h>#include <malloc.h>#include<stdlib.h>typedef char DataType;/*定义DataType类型*/typedef enum {Link,Thread}PointerTag;typedef struct node{ DataType data; struct node *lchild, *rchild;/*左右孩子子树*/ PointerTag LTag,RTag;}BiThrNode

c语言实现冒泡排序、希尔排序等多种算法示例_C 语言

实现以下排序 插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 希尔排序 O(n^1.25) 1.插入排序 O(n^2) 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:⒈ 从第一个元素开始,该元素可以认为已经被排序⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置⒋ 重复步骤3,直到找到已排序的元素

java数据结构与算法之noDups去除重复项算法示例_java

本文实例讲述了java数据结构与算法之noDups去除重复项算法.分享给大家供大家参考,具体如下: public static void noDupa(int[] a){ int count = 0;//in int sub = 0;//计数器 for(int i=0; i<a.length-1; i++){//外层循环 if(a[i] != a[i+1]){ a[count] = a[i]; count++; } } } PS:感觉这个算法粗略看下觉得没啥子,实际上相当精妙!!先决条件---数