算法学习--二叉查找树

简介:

   创建二叉查找树、查找二叉树中的某个节点、删除某个节点、

     新增节点、查找某个节点的父节点、查找最小节点

     对二叉树进行前序遍历、中序遍历、后序遍历

     前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树  
     中序遍历,也叫中根遍历,顺序是 左子树,根,右子树

    后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SuanFa
{
public class Order
{
//创建二分查找树
public Tree CreateBinaryTree(int[] A)
{
if (A == null || A.Length == 0)
{
return null;
}

Tree root
= new Tree(A[0]); //根节点 相当于表头指针
Tree treeNode,temp;//要添加的节点和中间节点

for (int i = 1; i < A.Length; i++)
{
temp
= root;
treeNode
= new Tree(A[i]);
AddTreeNode(temp, treeNode);
}

return root;
}

//添加树节点
private void AddTreeNode(Tree tree, Tree node)
{
if (node.Text < tree.Text)//添加左子节点
{
if (tree.LeftTree.Count == 0)
{
tree.LeftTree.Add(node);
}
else {
AddTreeNode(tree.LeftTree[
0], node);
}
}
else if (node.Text > tree.Text)//添加右子节点
{
if (tree.RightTree.Count == 0)
{
tree.RightTree.Add(node);
}
else
{
AddTreeNode(tree.RightTree[
0], node);
}
}
}

//查找某个节点
public Tree Find(Tree root,int text) {
if (root == null)//如果当前节点为null 返回null
{
return null;
}

if (root.Text == text)//如果等于当前节点就返回当前节点
{
return root;
}

if (root.LeftTree.Count > 0)//递归左子树
{
if (root.Text > text)
{
return Find(root.LeftTree[0],text);
}
}

if (root.RightTree.Count > 0)//递归右子树
{
if (root.Text<text)
{
return Find(root.LeftTree[0], text);
}
}

return null;//没找到返回null
}

//查找某个节点的父节点
public Tree FindF(Tree root, int text)
{
if (root == null)//如果当前节点为null 返回null
{
return null;
}

if (root.LeftTree.Count > 0)
{
if (root.LeftTree[0].Text == text)//如果等于当前节点的左子节点就返回当前节点
{
return root;
}
if (root.Text > text)//递归左子树
{
return FindF(root.LeftTree[0], text);
}
}

if (root.RightTree.Count > 0)
{
if (root.RightTree[0].Text == text)//如果等于当前节点的右子节点就返回当前节点
{
return root;
}
if (root.Text < text)//递归右子树
{
return FindF(root.RightTree[0], text);
}

}

return null;//没找到返回null
}

//前序遍历
public int DLR(Tree tree,List<int> list)
{
if (tree == null || list == null)
{
return 0;
}

list.Add(tree.Text);
//根节点

if (tree.LeftTree.Count > 0) //先遍历左子树
{
DLR(tree.LeftTree[
0],list);
}

if (tree.RightTree.Count > 0) //右子树
{
DLR(tree.RightTree[
0], list);
}

if (list.Count > 0)
return 1;
return 0;
}

//后序遍历
public int LRD(Tree tree, List<int> list)
{
if (tree == null || list == null)
{
return 0;
}


if (tree.LeftTree.Count > 0) //先遍历左子树
{
LRD(tree.LeftTree[
0], list);
}

if (tree.RightTree.Count > 0) //右子树
{
LRD(tree.RightTree[
0], list);
}

list.Add(tree.Text);
//根节点

if (list.Count > 0)
return 1;
return 0;
}

//中序遍历
public int LDR(Tree tree, List<int> list)
{
if (tree == null || list == null)
{
return 0;
}

if (tree.LeftTree.Count > 0) //先遍历左子树
{
LDR(tree.LeftTree[
0], list);
}

list.Add(tree.Text);
//根节点

if (tree.RightTree.Count > 0) //右子树
{
LDR(tree.RightTree[
0], list);
}

if (list.Count > 0)
return 1;
return 0;
}

//删除节点
//1:节点不存在
//2:节点存在且没有子树
//3:节点存在且有左子树,用以要删除节点为根节点树的最小节点代替当前节点
//4;节点存在且只有右子树,用药删除节点的右子节点代替当前节点
public Tree Delete(Tree tree, int text)
{
if (tree == null)
{
return null;
}
Tree newTree
= tree;
//要删除节点的父节点
Tree delFNode = FindF(newTree, text);

//要删除的节点
Tree delNode;
bool isleft = true;//标识被删节点是其所在树的左子节点还是右子节点

if (delFNode == null)//要删除的节点父节点为空有两种情况。1不存在;2是根节点
{
delNode
= Find(newTree, text);
if (delNode == null)//不存在
{
return newTree;
}
Tree tmp;
if (delNode.LeftTree.Count > 0)//存在左子树
{
tmp
= FindMin(delNode);
Tree tmpF
= FindF(delNode, tmp.Text);
tmpF.LeftTree.Remove(tmp);
tmp.LeftTree.Add(delNode.LeftTree[
0]);
if (delNode.RightTree.Count > 0)
{
tmp.RightTree.Add(delNode.RightTree[
0]);
}
newTree
= tmp;
}
else if (delNode.RightTree.Count > 0)//只有右子树
{
newTree
= delNode.RightTree[0];
}

return newTree;

}
//要删除的节点是左子树
else if (delFNode.LeftTree.Count > 0 && delFNode.LeftTree[0].Text == text)
{
delNode
= delFNode.LeftTree[0];
isleft
= true;
}
//要删除的节点是右子树
else if (delFNode.RightTree.Count > 0 && delFNode.RightTree[0].Text == text)
{
delNode
= delFNode.RightTree[0];
isleft
= false;
}
else//要删除的节点不存在
{
return newTree;
}

Tree temp;
//如果存在左子树,就用左子树的最小节点取代要删除的节点,并删除这个最小节点
if (delNode.LeftTree.Count > 0)
{
temp
= FindMin(delNode);

Tree tempDelNode
= delNode;
while (tempDelNode.LeftTree.Count > 0)
{
tempDelNode
= tempDelNode.LeftTree[0];
}
if (temp.Text != delNode.LeftTree[0].Text)
{
temp.LeftTree.Add(delNode.LeftTree[
0]);
}
delNode.LeftTree.Remove(tempDelNode);

//把要删除节点的右子树作为最小节点的右子树
if (delNode.RightTree.Count > 0)
{
temp.RightTree.Add(delNode.RightTree[
0]);
}

if (isleft)
{
delFNode.LeftTree.Add(temp);
delFNode.LeftTree.Remove(delNode);
}
else
{
delFNode.RightTree.Add(temp);
delFNode.RightTree.Remove(delNode);
}
}
else if (delNode.RightTree.Count > 0)
{
delFNode.RightTree.Add(delNode.RightTree[
0]);
}

return newTree;
}

//查找最小节点
public Tree FindMin(Tree tree)
{
if (tree == null)
{
return null;
}

//如果当前节点没有左子树就返回他自己
if (tree.LeftTree.Count == 0)
{
return tree;
}

//递归左子树
return FindMin(tree.LeftTree[0]);

}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SuanFa
{
public class Tree
{
//显示的值
public int Text
{
set;
get;
}

//构造函数
public Tree(int text) {
this.Text = text;
if (LeftTree == null)
{
LeftTree
= new List<Tree>();
}
if (RightTree == null)
{
RightTree
= new List<Tree>();
}
}

//左子树
public List<Tree> LeftTree
{
set;
get;
}

//右子树
public List<Tree> RightTree
{
set;
get;
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SuanFa
{
class Program
{
static void Main(string[] args)
{
int[] B = new int[] { 50,25,75,15,35,65,85,10,20,30,40,60,70,80,90 };
Order order
= new Order();
Tree tree
= order.CreateBinaryTree(B);

Console.Write(
"原先数组:");
foreach (int i in B)
{
Console.Write(i.ToString()
+ " ");
}
Console.WriteLine();
Console.Write(
"----------------------------形成二叉查找树--------------------------");
Console.WriteLine();
Console.WriteLine(
"删除前:");
Console.WriteLine();
Show(B, order, tree);
Console.WriteLine();
Console.WriteLine();
Tree newTree
= order.Delete(tree,50);
Console.WriteLine(
"删除跟节点50后:");
Console.WriteLine();
Show(B, order, newTree);
Console.WriteLine();
Console.WriteLine();
Tree newTree1
= order.Delete(newTree, 65);
Console.WriteLine(
"删除65后:");
Console.WriteLine();
Show(B, order, newTree1);
Console.ReadLine();
}

private static void Show(int[] B, Order order, Tree tree)
{
List
<int> listDlr = new List<int>();
if (order.DLR(tree, listDlr) > 0)
{
Console.Write(
"前序遍历:");
foreach (int i in listDlr)
{
Console.Write(i.ToString()
+ " ");
}
Console.WriteLine();
Console.WriteLine();
}

List
<int> listLrd = new List<int>();
if (order.LRD(tree, listLrd) > 0)
{
Console.Write(
"后序遍历:");
foreach (int i in listLrd)
{
Console.Write(i.ToString()
+ " ");
}
Console.WriteLine();
Console.WriteLine();
}

List
<int> listLdr = new List<int>();
if (order.LDR(tree, listLdr) > 0)
{
Console.Write(
"中序遍历:");
foreach (int i in listLdr)
{
Console.Write(i.ToString()
+ " ");
}
}
}
}
}
复制代码
目录
相关文章
|
5月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
201 0
|
3月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
253 4
|
4月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
271 1
|
6月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
164 2
|
8月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
8月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
216 17
|
8月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
194 7
|
10月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
10月前
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
360 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
7月前
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
240 0

热门文章

最新文章