11.9树的表示方法(孩子,父亲,孩子兄弟),树、森林的遍历,一些操作,决策树,前缀树

父亲表示法 

优缺点:利用了树中除根结点外每个结点都有唯一的父节点这个性质,很容易找到树根,但是找孩子需要遍历整个线性表。

最近公共祖先

第一种方法,找路径然后比较

如果是搜索树,可以二分查找

不是,就dfs

第二种,不找路径

如果在同一层,那么就同步移动

如果不在同一层,

如果不在同一层,就让层数深的上升到层数浅的同一层,之后就是回到第一种情况,判断只要不相同,那么就接着同步往上走

经过这步,tx,ty同步向上,一个到根节点后,那么另一个还没到,它到根节点的距离,就是x与y的距离差值,如果ty<0,那就说明y先到根,y处于浅层,交换一下,就是让x处于浅层,y处于深层,并把ty赋值为tx,此时ty到根的距离就代表y和x之间的距离差

这步就是把深层结点往浅层结点走,Ty到根节点时,y就到了和x的同一层

孩子表示法

struct node
{
char data;
tree child[m]//m个孩子
};
tree t;

缺陷:只能从父结点遍历到子结点,不能从某个子结点返回到父结点。

孩子兄弟表示法

struct node{
char data;
tree firstchild,next;
}

左孩子,右兄弟

树与二叉树的转换

森林与二叉树转换

查找树的指定结点

左孩子,右兄弟,所以先找自己,自己的数据不对,找左孩子,如果没找到,那么node为空指针,则找右兄弟,即前序遍历

树与对应二叉树的遍历

void tral(tree t ,int m)
{
if(t)
{
cout<data<<endl;
for(int i=0;i<m;i++)
tral(t->child[i],m) //m为孩子的个数
}
}

树的遍历方案

树没有中序遍历,因为没有中的概念。前序就是先访问树根,再孩子;后序是先孩子,再根

注意下图M的位置标错了,应该是J的孩子而不是I的孩子

递归后序到F时,由于同样要后序,所以就先KL,最后在F,F完了再G

层序遍历树

森林遍历

前缀树

决策树

ID3算法

二叉搜索树插入

包装了一下

//插入一个节点,树为空,插入节点即为根节点,否则找合适的位置插入
void InsertNode(BiTree &tree, BiTree &s)		//注意:使用引用传递
{
	if (tree == NULL)
		tree = s;
	else
		SearchTreeNode(tree, s);
}
//二叉排序树创建,每次增加一个结点,插到现有的二叉树上去
void CreateOrderBinaryTree(BiTree &tree, int *a)
{
	for (int i = 0; i < len; i++)
	{
		BiTree s = (BiTree)malloc(sizeof(BiTNode));
		s->data = a[i];
		s->lchild = NULL;
		s->rchild = NULL;
		InsertNode(tree, s);
	}
}

 

typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild, *rchild;
} *BiTree;

typedef struct Node
{
	BiTree btnode;
	bool isfirst;
}*node;

非递归遍历 

//非递归前序遍历
void ProOrder(BiTree pRoot)
{
	if (pRoot == NULL)
		return;
	BiTree p = pRoot;
	stack<BiTree>s;

	while (p != NULL || !s.empty())
	{
		while (p != NULL)
		{
			s.push(p);
			cout << p->data << " ";		//第一次遇见的时候输出
			p = p->lchild;
		}
		if (!s.empty())
		{
			p = s.top();
			s.pop();
			p = p->rchild;
		}
	}
}
//非递归中序遍历
void midOrder(BiTree pRoot)
{
	if (pRoot == NULL)
		return;
	BiTree p = pRoot;
	stack<BiTree>s;
	while (p != NULL || !s.empty())
	{
		while (p!=NULL)
		{
			s.push(p);
			p = p->lchild;
		}
		if (!s.empty())
		{
			p = s.top();
			cout << p->data << " ";		//第二次遇见的时候输出
			s.pop();
			p = p->rchild;
		}
	}
}

 

//非递归实现后续遍历
void postOrder(BiTree pRoot)
{
	if (pRoot == NULL)
		return;
	stack<node>s;
	BiTree p = pRoot;
	node tmp;
	while (p!=NULL || !s.empty())
	{
		while (p != NULL)		//沿左子树一直往下搜索,直至出现没有左子树的结点
		{
			node btn = (node)malloc(sizeof(Node));
			btn->btnode = p;
			btn->isfirst = true;
			s.push(btn);
			p = p->lchild;
		}
		if (!s.empty())
		{
			tmp = s.top();
			s.pop();
			if (tmp->isfirst == true)			//第一次出现在栈顶
			{
				tmp->isfirst = false;
				s.push(tmp);
				p = tmp->btnode->rchild;
			}
			else						//第二次出现在栈顶
			{
				cout << tmp->btnode->data<<" ";
				p = NULL;
			}
		}
	}
}

//非递归实现后续遍历
void postorder(BiTree pRoot)
{
	if (pRoot == NULL)
		return;
	stack<BiTree>s;
	BiTree cur = pRoot, pre = NULL;
	s.push(pRoot);
	while (!s.empty())
	{
		cur = s.top();
		if ((cur->lchild == NULL&&cur->rchild == NULL) ||
			((pre == cur->lchild || pre == cur->rchild) && pre != NULL))
		{
			cout << cur->data << " ";
			s.pop();
			pre = cur;
		}
		else
		{
			if (cur->rchild != NULL)
				s.push(cur->rchild);
			if (cur->lchild != NULL)
				s.push(cur->lchild);
		}
	}
}

 

  • 26
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
flexlm_sdk_11.9是一种用于管理软件许可证的软件开发工具包(SDK)。它为开发人员提供了一组API和工具,可以帮助他们实现软件许可证的管理和控制。以下是使用flexlm_sdk_11.9的基本步骤: 1. 下载和安装SDK:首先,您需要从官方网站下载flexlm_sdk_11.9,并按照提供的指导安装到您的开发环境中。 2. 创建许可证文件:使用flexlm_sdk_11.9提供的工具,您可以创建一个许可证文件,其中包含了许可证信息和授权细节。您可以指定许可证的有效期、授权数量等参数。 3. 集成SDK到应用程序中:在您的应用程序代码中,引入flexlm_sdk_11.9的API库文件,并调用相应的函数来初始化和管理许可证。您可以使用提供的函数来检查许可证状态、授权用户、监视许可证使用情况等。 4. 配置许可证服务器:如果您的应用程序需要在网络环境中进行许可证管理,则需要配置一个许可证服务器来管理许可证的分发和控制。您可以使用flexlm_sdk_11.9提供的工具来配置服务器参数。 5. 测试和部署:在您的开发环境中,可以使用提供的示例代码和工具来测试您的许可证管理功能。一旦测试通过,您就可以将应用程序和许可证一起部署到生产环境中。 请注意,flexlm_sdk_11.9是一个相对复杂的工具包,使用前需要对软件许可证管理有一定的了解。建议在开始使用之前,阅读官方文档和相关教程,以便更好地理解和使用该SDK。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值