关于二叉树,建立、遍历、求节点最大距离

今天做了一题求二叉树节点的最大距离,顺便写了下二叉树的建立,遍历的过程。

我觉得这题的主要思想是深度遍历+动态规划,我们在深度遍历的过程中,对于某一个子树,求出左右子树叶子节点到根节点的最大距离,进而求出经过根节点的最大距离。 最后求出所有子树经过根节点的最大距离。就是这个题目的最终结果。代码如下:

//二叉树的建立,以及遍历
//16 14 8 2 -1 -1 4 -1 -1 7 1 -1 -1 -1 10 9 -1 -1 3 -1 -1
//16 14 8 2 -1 -1 4 -1 -1 7 1 -1 -1 -1 -1
void  BuildBTree(BTreeNode* &pRoot)
{
	int nTemp;
	cin >> nTemp;
	if (nTemp == -1)
	{
		pRoot = NULL;
	}
	else
	{
		pRoot = new BTreeNode();
		pRoot->nValue = nTemp;

		BuildBTree(pRoot->pLeft);
		BuildBTree(pRoot->pRight);
	}
}

void PreOrderBTree(BTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return;
	}

	cout << pRoot->nValue << " ";
	PreOrderBTree(pRoot->pLeft);
	PreOrderBTree(pRoot->pRight);
}

void MidOrderBTree(BTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return;
	}
	MidOrderBTree(pRoot->pLeft);
	cout << pRoot->nValue << " ";
	MidOrderBTree(pRoot->pRight);
}

void PostOrderBTree(BTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return;
	}
	PostOrderBTree(pRoot->pLeft);
	PostOrderBTree(pRoot->pRight);
	cout << pRoot->nValue << " ";
}

int  GetMaxNodeMaxDistance(BTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return -1;
	}

	//左子树叶子结点到根结点的最大距离
	int max_left_distance = GetMaxNodeMaxDistance(pRoot->pLeft);
	//右子树叶子结点到根结点的最大距离
	int max_right_distance = GetMaxNodeMaxDistance(pRoot->pRight);
	//每个子树节点的最大距离
	int max_root_distance = max_left_distance + max_right_distance + 2;
	//比较每个子树节点的最大距离
	if (max_root_distance > max_distance)
	{
		max_distance = max_root_distance;
	}

	return max_left_distance > max_right_distance ? max_left_distance+1 : max_right_distance+1;
}

int max_distance = 0;
int main()
{

	BTreeNode* Root = NULL;
	BuildBTree(Root);

	cout << "----------------Build End------------------" << endl;
	system("pause");
	cout << "PreOrderBTree:" << endl;
	PreOrderBTree(Root);
	cout << endl << "MidOrderBTree:" << endl;
	MidOrderBTree(Root);
	cout << endl << "PostOrderBTree:" << endl;
	PostOrderBTree(Root);
	cout << endl << "GetMaxNodeMaxDistance:" << endl;
	GetMaxNodeMaxDistance(Root);
	cout << max_distance << endl;

	system("pause");
   return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 11:19:24

关于二叉树,建立、遍历、求节点最大距离的相关文章

二叉树建立和遍历

二叉树创建遍历规则: 1.先序:根-左-右 2.中序:左-根-右 3.后序:左-右-根 二叉树定义和辅助函数如下: struct node { int data; struct node* left; struct node* right; }; void visit(int data) { printf("%d ", data); } int indata() { int data; scanf("%d",&data); return data; } 先序

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

二叉树基本操作续一:二叉树建立、节点数统计

在上一篇:二叉树基本操作 中,我们描述了二叉树的递归遍历函数.在这里主要是给出这些函数的测试代码,为了测试更加方便,我们实现了三个新的函数:建立二叉树.统计二叉树叶子节点数量.统计二叉树总节点数量.(二叉树的定义用上篇文章中的定义) 二叉树建立: 1 tree_pointer create_bin_tree() 2 { 3 tree_pointer node; 4 int x; 5 scanf("%d", &x); 6 if (x == 0) { 7 node = NULL;

二叉树先序遍历中序遍历求后序遍历

先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再依靠中序遍历找到左子树的左子树(右子树同理).这样层层递归就能还原二叉树.之后求出后序遍历. 感谢原博主http://www.cnblogs.com/rain-lei/p/3576796.html 一开始递归不会写,看了博主的发现其实很简单.注意还原二叉树时return root. #include

笔试算法题(36):寻找一棵二叉树中最远节点的距离 &amp; 根据二叉树的前序和后序遍历重建二叉树

出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所以计算出以每个节点为根节点的子树的最 远距离,最后取他们的最大值就是整棵树的最远距离: 如果递归层次过多造成系统栈溢出,则可以使用stack堆栈结构存储递归节点,从而使用循环实现 解题: 1 struct Node { 2 int value; 3 Node *left; 4 Node *right

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

二叉树的遍历与建立

二叉树简介 二叉树是一种非线性结构,二叉树的遍历方式有三种:前序.中序和后序.  在学习二叉树的时候,把二叉树分为三部分:根结点,左子树和右子树,所谓遍历方式即访问这三部分的先后顺序. 我对于二叉树遍历的方式的理解是這样的: 前序遍历:先访问根结点,再访问左子树,最后访问右子树. 中序遍历:先访问左子树,再访问根节点,最后访问右子树. 后序遍历:先访问左子树,再访问右子树,最后访问根结点. 1.二叉树的建立 #define _CRT_SECURE_NO_WARNINGS 1 #include<i

二叉树 - 建立与遍历使用Java

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根节点,然后前序遍历左子树,再前序遍历右子树 中序遍历:若二叉树为空,则空操作返回null.否则从根节点开始,中序遍历根节点左子树,然后访问根节点,最后中序遍历右子树 后序遍历:若二叉树为空,则空操作返回null.否则以从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点 层序遍历:若树为空,空

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo