二叉树深度、平衡、相等、求遍历

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char  elem;
};  

//知道先序遍历和中序遍历 求后序遍历
TreeNode* BinaryTreeFromOrderings(char* inorder, char* preorder, int length)
{
    if(length <= 0||preorder==NULL||preorder==NULL)//递归终止条件
    {
        return NULL;
    }
    TreeNode* node = new TreeNode;//Noice that [new] should be written out.
    node->elem = *preorder; //将根节点赋值给新节点
    int rootIndex = 0;
    for(;rootIndex < length; rootIndex++)//找出中序遍历中的头结点
    {
        if(inorder[rootIndex] == *preorder)
            break;
    }
    if (rootIndex>=length)//如果没有找到
    {
        throw std::exception("invalid input");
    }
    node->left = BinaryTreeFromOrderings(inorder, preorder +1, rootIndex);//左子树递归
    node->right = BinaryTreeFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));//右子树递归
    std::cout<<node->elem;
    return node;
}  

//递归求二叉树的深度
int PostTreeDepth(TreeNode *root)
{
    int max,leftheight,rightheight;
    if (root==NULL)
    {
        return 0;
    }
    else
    {
        leftheight=PostTreeDepth(root->left);
        rightheight=PostTreeDepth(root->right);
        max=leftheight>rightheight?leftheight:rightheight;
        return (max+1);
    }
}
//判断两个树是否相等
bool isTwoTreesEuqal(TreeNode *tree1,TreeNode *tree2)
{
    if (tree1==NULL&&tree2==NULL)//两个都空 相等
    {
        return true;
    }
    if (tree1&&!tree2||!tree1&&tree2)//一个空一个非空 不等
    {
        return false;
    }
    if (tree1&&tree2)//两个都非空 判断是否相等
    {
        if (tree1->elem==tree2->elem)
        {
            if (isTwoTreesEuqal(tree1->left,tree2->left))
            {
                return isTwoTreesEuqal(tree1->right,tree2->right);
            }
            else if (isTwoTreesEuqal(tree1->left,tree2->right))
            {
                return isTwoTreesEuqal(tree1->right,tree2->left);
            }

        }
    }
    return false;
}

//判断二叉树是否是平衡二叉树
bool isBalanced(TreeNode *root)
{
    if (root==NULL)
    {
        return true;
    }
    int leftheight=PostTreeDepth(root->left);
    int rightheight=PostTreeDepth(root->right);
    if (abs(leftheight-rightheight)>1)//如果大于1的话直接返回假 否则继续递归判断
    {
        return false;
    }
    else
        return isBalanced(root->left)&&isBalanced(root->right);
}
int main(int argc, char** argv)
{
    char* pr="GDAFEMHZ";
    char* in="ADEFGHMZ";
    TreeNode *root1=BinaryTreeFromOrderings(in, pr, 8);
    cout<<endl;
    cout<<PostTreeDepth(root1)<<endl;
    char* pr2="DAFEMHZ";
    char* in2="ADEFHMZ";
    TreeNode *root2=BinaryTreeFromOrderings(in2, pr2,7);
    cout<<endl;
    cout<<PostTreeDepth(root1)<<endl;
    cout<<isTwoTreesEuqal(root1,root2)<<endl;
    cout<<isBalanced(root1)<<endl;
    return 0;
} 

时间: 2024-08-23 22:14:07

二叉树深度、平衡、相等、求遍历的相关文章

二叉树的深度 判断二叉树是否平衡 38

? ? 问题一 ? ? 引言 ? ? 在之前我们讲到过如果保存树根节点到叶子节点之间的路径,其中包含了如何判断一个节点是否是叶子节点,而且用栈保存了路径中的节点,只要遍历一下栈即可,然后用一个深度保存所有遍历深度中的最大值 ? ? 但仔细想想,这种方法是否过于繁琐,我们其实不需要一个完整的路径,为什么要去用一个栈保留路径呢,我们仅仅需要的是深度而已,所以我们可以从深度的角度出发去思考问题 ? ? 分析问题 ? ? 考虑递归,一棵树的深度一定是左子树和右子树深度较大值加1 ? ? 左子树如果是空,

求二叉树深度

概念: 1.二叉树深度:树中结点的最大层次称为树的深度或高度. 2.二叉树层次:从根开始定义起,根为第一层,根的孩子为第二层,以此类推. 要点: 1.递归. 2.二叉树深度为左右子树深度较大值+1. 代码: /* 求二叉树深度 by Rowandjj 2014/7/13 ------------------------------- 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 输入: 第一行输入有n,n表示

二叉树(4)----求二叉树深度

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树深度 定义:对任意一个子树的根节点来说,它的深度=左右子树

一步一步写算法(之二叉树深度遍历)

原文:一步一步写算法(之二叉树深度遍历) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 深度遍历是软件开发中经常遇到的遍历方法.常用的遍历方法主要有下面三种:(1)前序遍历:(2)中序遍历:(3)后序遍历.按照递归的方法,这三种遍历的方法其实都不困难,前序遍历就是根-左-右,中序遍历就是左-根-右,后续遍历就是左-右-根.代码实现起来也不复杂. 1)前序遍历 void preorder_traverse(TREE_NODE* pTree

【数据结构与算法】二叉树深度遍历(递归)

二叉树的深度遍历用递归的话就没有什么好说的了. 代码实现 /** * 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:[email protected] * 作者:A2BGeek */ public class TreeIteratorRecursion { class TreeNode<T> { private T mNodeData; private TreeNode<T> mLeftChi

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里. 图示 代码实现 /** * 源代码名称:TreeIteratorNoRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历(非递归) * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class TreeIteratorNoRecursion { class TreeNode<T> { private T mNod

判断二叉树是否平衡

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 注:这里不考虑该二叉树是否是二叉排序树 解决要点: 1.后序遍历二叉树: 2.递归. 核心算法: bool isBalanced(pTree pT,int *depth) { if(!pT)//参数判断 { *depth = 0; return true; } //后序遍历 int left,right; if(isBalanced(pT->lChild,&

判断一个二叉树是否平衡

判断二叉树是否平衡的方法是求左右儿子的深度相差是否大于1,大于则这个二叉树不平衡. class Solution { public: int height(TreeNode *root) {//求节点的高度 if(root == NULL)return 0; return max(height(root->left), height(root->right)) + 1; } bool isBalanced(TreeNode* root) { if(root == NULL)return tru

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

二叉树之 二叉树深度

二叉树深度: // 获取最大深度 public static int getMaxDepth(TreeNode root) { if (root == null) return 0; else { int left = getMaxDepth(root.left); int right = getMaxDepth(root.right); return 1 + Math.max(left, right); } } 二叉树宽度: 使用队列,层次遍历二叉树.在上一层遍历完成后,下一层的所有节点已经放