求二叉树第m层上的第K个结点的值

简介:
/*
2.给定以下二叉树:

struct node_t

{

node_t *left, *right;

int value;

};
要求编写函数 node_t* foo(node_t *node, unsigned int m, unsigned int k);

输出以 node 为根的二叉树第 m 层的第 k 个节点值.

(level, k 均从 0 开始计数)

注意:

.此树不是完全二叉树;

.所谓的第K个节点,是本层中从左到右的第K个节点 

第三题 系统设计题
*/
#include <iostream>
using namespace std;

const int MAX_LENGTH = 100;

struct node_t
{
	node_t *left;
	node_t *right;
	int value;
};

node_t *queue[100];
int level = 0; // 记录第几层
int count = 0; // 记录第level层的第几个结点
int top = -1;
int rear = -1;

bool IsQueueEmpty()
{
	return top == rear;
}

void EnQueue(node_t *node)
{
	queue[++rear] = node;
}

node_t* DeQueue()
{
    return queue[++top];
}

void CreateBiTree(node_t **root)
{
	char ch;

	cin >> ch;
	
	if (ch == '*')
	{
		*root = NULL;
		return;
	}
	else
	{
		*root = new node_t;
		(*root)->value = ch;
		CreateBiTree(&(*root)->left);
		CreateBiTree(&(*root)->right);
	}
}

node_t* foo(node_t *node, unsigned int m, unsigned int k)
{
	node_t *p = node;
    int last = -1;
    
	if (p != NULL)
	{
		EnQueue(p); // 入队
		while (!IsQueueEmpty())
		{
			last = rear;
			while (top < last)
			{
				node_t *q = DeQueue();
				count++; // 当前层的第X个结点

				if (level == m && count == k)
				{
					cout << q->value << endl;
					return q;
				}

				if (q->left != NULL)
				{
					EnQueue(q->left);
				}

				if (q->right != NULL)
				{
					EnQueue(q->right);
				}
			}

			level++;
            count = 0;
		}
	}

	cout << "找不到符合的结点" << endl;

	return NULL;
}

int main()
{
	node_t *root;
	CreateBiTree(&root);
	cout << "树建立完毕" << endl;

	foo(root, 1, 1);

	return 0;
}

目录
相关文章
二叉树层序遍历及判断完全二叉树
二叉树层序遍历及判断完全二叉树
167 2
|
8月前
|
算法 C++ 开发者
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
100 0
|
8月前
|
存储
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
|
7月前
【树 - 平衡二叉树(AVL)】F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量
【树 - 平衡二叉树(AVL)】F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量
|
8月前
|
机器学习/深度学习 C++
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
计算左子树规模(结点个数),找出树的根结点
简单的计算公式教你找出左子树到底有多少个娃,也会与你一起寻找根结点,快来看看呀
计算左子树规模(结点个数),找出树的根结点
|
8月前
|
算法
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
二叉树子树结点个数
二叉树子树结点个数
65 0
|
算法 安全
二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)
二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)
361 0
二叉树判断
二叉树判断
76 0

热门文章

最新文章