zoukankan      html  css  js  c++  java
  • 求二叉树的深度和宽度

    // 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点。
    #include "stdafx.h"
    #include <iostream>
    #include <queue>
    using namespace std;
    
    struct BTNode
    {
    	char m_value;
    	BTNode *m_left;
    	BTNode *m_right;
    };
    
    //先序创建二叉树
    void CreatBTree(BTNode *&root)
    {	
    	char nValue = 0;
    	cin >> nValue;
    	if ('#' == nValue)
    	{
    		return;
    	}
    	else
    	{
    		root = new BTNode();
    		root->m_value = nValue;
    		CreatBTree(root->m_left);
    		CreatBTree(root->m_right);
    	}	
    }
    
    //求二叉树的深度
    int GetDepth(BTNode *pRoot)
    {
    	if (pRoot == NULL)
    	{
    		return 0;
    	}
    
    	// 	int nLeftLength = GetDepth(pRoot->m_left);
    	// 	int nRigthLength = GetDepth(pRoot->m_right);
    	// 	return nLeftLength > nRigthLength ? (nLeftLength + 1) : (nRigthLength + 1);
    
    	return GetDepth(pRoot->m_left) > GetDepth(pRoot->m_right) ? 
    		(GetDepth(pRoot->m_left) + 1) : (GetDepth(pRoot->m_right) + 1);
    }
    
    //求二叉树的宽度
    int GetWidth(BTNode *pRoot)
    {
    	if (pRoot == NULL)
    	{
    		return 0;
    	}
    
    	int nLastLevelWidth = 0;//记录上一层的宽度
    	int nTempLastLevelWidth = 0;
    	int nCurLevelWidth = 0;//记录当前层的宽度
    	int nWidth = 0;//二叉树的宽度
        queue<BTNode *> myQueue;
    	myQueue.push(pRoot);//将根节点入队列
    	nLastLevelWidth = 1;	
    	BTNode *pCur = NULL;
    
    	while (!myQueue.empty())//队列不空
    	{
    		nTempLastLevelWidth = nLastLevelWidth;
    		while (nTempLastLevelWidth != 0)
    		{
                pCur = myQueue.front();//取出队列头元素
    			myQueue.pop();//将队列头元素出对
    
    			if (pCur->m_left != NULL)
    			{
    				myQueue.push(pCur->m_left);
    			}
    
    			if (pCur->m_right != NULL)
    			{
    				myQueue.push(pCur->m_right);
    			}
    
    			nTempLastLevelWidth--;
    		}
    
    		nCurLevelWidth = myQueue.size();
    		nWidth = nCurLevelWidth > nLastLevelWidth ? nCurLevelWidth : nLastLevelWidth;
    		nLastLevelWidth = nCurLevelWidth;
    	}
    
    	return nWidth;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	BTNode *pRoot = NULL;	
    	CreatBTree(pRoot);
        cout << "二叉树的深度为:" << GetDepth(pRoot) << endl;
    	cout << "二叉树的宽度为:" << GetWidth(pRoot) << endl;	
    	system("pause");
    	return 0;
    }
    

    运行结果:


  • 相关阅读:
    软件工程笔记
    人工智能学习笔记
    Linux学习笔记
    【Java】SpringMVC+JSP部署服务器配置
    【Android】是时候为你的应用加上WebDav同步了
    【Android】发布你的第一个开源程序到jcenter遇到的坑
    【C#】支持私聊、多人聊天、图片发的TCP程序
    【Android】让你的安卓app国际化、支持语言自动切换
    【Java】创建一个Maven管理的Web项目并连接数据库
    JS 事件循环怎么处理宏任务和微任务?
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3358189.html
Copyright © 2011-2022 走看看