求二叉树的最大叶子节点距离(递归)
2017-03-02 12:45
633 查看
题目: 输入一颗二叉树先序遍历的字符串,输出该二叉树的最大叶子节点距离
思路:先定义一个表示最大叶子节点距离的全局变量,然后按照后续遍历的方法访问每一个节点,
在遍历的过程中全局变量随时更新为目前出现的最大节点距离。当访问完根节点后,全局变量里
的值即为最大叶节点距离。
节点类型定义如下:
//存储最大叶子节点距离的全局变量
int maxDepth = 0;
//按照先序遍历的顺序输入一棵二叉树的所有节点,#代表空节点,创建一颗二叉树
//后序遍历输出二叉树所有节点,验证上面建立的二叉树是否正确
//查找最大叶子节点距离
//按后序遍历的方式依次删除二叉树的每一个节点
//main函数
整理一下全部的代码:
测试用例1: FGHA###M##JK#B##L##
构建的二叉树如下图所示:
知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。
运行结果如下图所示:
从上图可以看到运行结果正确,说明程序编码无误。
测试用例2:A#BCEG####DF#H###
构建的二叉树如下图所示:
知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。
运行结果如下图所示:
从上图可以看到运行结果正确,说明程序编码无误。
思路:先定义一个表示最大叶子节点距离的全局变量,然后按照后续遍历的方法访问每一个节点,
在遍历的过程中全局变量随时更新为目前出现的最大节点距离。当访问完根节点后,全局变量里
的值即为最大叶节点距离。
节点类型定义如下:
struct BTNode { char key; BTNode* lchild, *rchild; int maxLeftDepth; int maxRightDepth; BTNode(char val) :key(val), lchild(NULL), rchild(NULL), maxLeftDepth(0), maxRightDepth(0) {}; };
//存储最大叶子节点距离的全局变量
int maxDepth = 0;
//按照先序遍历的顺序输入一棵二叉树的所有节点,#代表空节点,创建一颗二叉树
void createTree(BTNode*& root) { char val = getchar(); if (val == '#') { root = NULL; return; } else { if (root == NULL) { root = new BTNode(val); createTree(root->lchild); createTree(root->rchild); } } }
//后序遍历输出二叉树所有节点,验证上面建立的二叉树是否正确
void PostOrderTraversal(BTNode* root) { if (root == NULL) return; PostOrderTraversal(root->lchild); PostOrderTraversal(root->rchild); cout << root->key << " "; }
//查找最大叶子节点距离
void maxLeafDistance(BTNode* root) { if (root == NULL) return ; //先访问左孩子节点 if (root->lchild == NULL) root->maxLeftDepth = 0; if (root->lchild != NULL) maxLeafDistance(root->lchild); //再访问右孩子节点 if (root->rchild == NULL) root->maxRightDepth = 0; if (root->rchild != NULL) maxLeafDistance(root->rchild); //最后访问根节点 if (root->lchild) { int maxLeftDepOfRt = ((root->lchild->maxLeftDepth > root->lchild->maxRightDepth) ? root->lchild->maxLeftDepth + 1 : root->lchild->maxRightDepth + 1); root->maxLeftDepth = maxLeftDepOfRt; } if (root->rchild) { int maxRightDepOfRt = (root->rchild->maxLeftDepth > root->rchild->maxRightDepth) ? root->rchild->maxLeftDepth + 1 : root->rchild->maxRightDepth + 1; root->maxRightDepth = maxRightDepOfRt; } //访问完根节点后依据需要更新代表最大叶子节点距离的全局变量 if (root->maxLeftDepth + root->maxRightDepth >maxDepth) { maxDepth = root->maxLeftDepth + root->maxRightDepth; } return ; }
//按后序遍历的方式依次删除二叉树的每一个节点
void destroyTree(BTNode*& root) { if (root != NULL) { if (root->lchild == NULL && root->rchild == NULL) { cout << "删除" << root->key << "节点" << endl; delete root; root = NULL; return; } destroyTree(root->lchild); destroyTree(root->rchild); cout << "删除" << root->key << "节点" << endl; delete root; root = NULL; } else return; }
//main函数
int main() { BTNode* root = NULL; cout << "请按先序遍历顺序输入一颗二叉树,#代表空节点: "; createTree(root); cout << "建立的二叉树的后序遍历顺序为: "; PostOrderTraversal(root); cout << endl; maxLeafDistance(root); cout << "构造的二叉树中最大叶子节点距离为: " << maxDepth << endl; destroyTree(root); return 0; }
整理一下全部的代码:
#include<iostream>
using namespace std;
struct BTNode { char key; BTNode* lchild, *rchild; int maxLeftDepth; int maxRightDepth; BTNode(char val) :key(val), lchild(NULL), rchild(NULL), maxLeftDepth(0), maxRightDepth(0) {}; };
int maxDepth = 0;//代表最大叶子节点距离的全局变量
void createTree(BTNode*& root) { char val = getchar(); if (val == '#') { root = NULL; return; } else { if (root == NULL) { root = new BTNode(val); createTree(root->lchild); createTree(root->rchild); } } }
void PostorderTraversal(BTNode* root)
{
if (root == NULL)
return;
PostorderTraversal(root->lchild);
PostorderTraversal(root->rchild);
cout << root->key << " ";
}
void maxLeafDistance(BTNode* root) { if (root == NULL) return ; //先访问左孩子节点 if (root->lchild == NULL) root->maxLeftDepth = 0; if (root->lchild != NULL) maxLeafDistance(root->lchild); //再访问右孩子节点 if (root->rchild == NULL) root->maxRightDepth = 0; if (root->rchild != NULL) maxLeafDistance(root->rchild); //最后访问根节点 if (root->lchild) { int maxLeftDepOfRt = ((root->lchild->maxLeftDepth > root->lchild->maxRightDepth) ? root->lchild->maxLeftDepth + 1 : root->lchild->maxRightDepth + 1); root->maxLeftDepth = maxLeftDepOfRt; } if (root->rchild) { int maxRightDepOfRt = (root->rchild->maxLeftDepth > root->rchild->maxRightDepth) ? root->rchild->maxLeftDepth + 1 : root->rchild->maxRightDepth + 1; root->maxRightDepth = maxRightDepOfRt; } //访问完根节点后依据需要更新代表最大叶子节点距离的全局变量 if (root->maxLeftDepth + root->maxRightDepth >maxDepth) { maxDepth = root->maxLeftDepth + root->maxRightDepth; } return ; }
void destroyTree(BTNode*& root) { if (root != NULL) { if (root->lchild == NULL && root->rchild == NULL) { cout << "删除" << root->key << "节点" << endl; delete root; root = NULL; return; } destroyTree(root->lchild); destroyTree(root->rchild); cout << "删除" << root->key << "节点" << endl; delete root; root = NULL; } else return; }
int main()
{
BTNode* root = NULL;
cout << "请按先序遍历顺序输入一颗二叉树,#代表空节点: ";
createTree(root);
cout << "建立的二叉树的后序遍历顺序为: ";
PostorderTraversal(root);
cout << endl;
maxLeafDistance(root);
cout << "构造的二叉树中最大叶子节点距离为: " << maxDepth << endl;
destroyTree(root);
return 0;
}
测试用例1: FGHA###M##JK#B##L##
构建的二叉树如下图所示:
知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。
运行结果如下图所示:
从上图可以看到运行结果正确,说明程序编码无误。
测试用例2:A#BCEG####DF#H###
构建的二叉树如下图所示:
知红色路径上的两个叶子节点为最大距离叶子节点,距离为6。
运行结果如下图所示:
从上图可以看到运行结果正确,说明程序编码无误。
相关文章推荐
- 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
- 先序遍历建立二叉树,求保存最大数字的叶子节点到最小数字的叶子结点的距离 2016网易编程题
- 《编程之美》——求二叉树中节点的最大距离(非递归)
- 求二叉树中节点的最大距离 | 递归
- [C语言]求二叉树节点最大距离(C、JAVA 递归、非递归)
- 求二叉树最大叶子节点距离(不含全局变量)
- 《编程之美》——求二叉树中节点的最大距离(非递归)
- 二叉树求最大最小叶子节点距离
- 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
- 利用栈结构实现二叉树的非递归遍历,求二叉树深度、叶子节点数、两个结点的最近公共祖先及二叉树结点的最大距离
- 编程之美之求二叉树中节点的最大距离(递归和非递归法)
- 利用栈结构实现二叉树的非递归遍历,求二叉树深度、叶子节点数、两个结点的最近公共祖先及二叉树结点的最大距离
- 二叉树中节点的最大距离(递归,动态规划)
- 二叉树权值最大的叶子节点到权值最小的叶子节点的距离
- 利用栈结构实现二叉树的非递归遍历,求二叉树深度、叶子节点数、两个结点的最近公共祖先及二叉树结点的最大距离
- 求二叉树中节点的最大距离递归解法
- 网易——求二叉树最大叶子节点到最小叶子节点的距离
- 二叉树中节点的最大距离(树的最长路径)——递归解法
- 求二叉树中节点的最大距离(递归)
- 搜狐研究院 求二叉树最大叶子节点到最小叶子节点的距离