建立(线索)二叉树,求出树的深度,最大结点。

#include<bits/stdc++.h>
using namespace std;
typedef struct Tnode{
	struct Tnode* right;
	struct Tnode* left;
	int data;
}Node;
typedef struct {
	Node *root; //此处是指针 指向根结点
}Tree;
/**
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,
或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
                                                                        
                                                                                            --引用百度百科
**/
void findBinaryTree(Tree* tree,int data){
	Node* node=(Node *)malloc(sizeof(Node *));
	node->left=NULL;
	node->right=NULL;
	node->data=data;
	if(tree->root==NULL){
		tree->root=node;
	}else{
		Node* temp=tree->root; //创建一个指针遍历树结点并加入新的结点
		while(temp!=NULL){
			if(temp->data>data){
//				temp=temp->left;   //此处的错误就和尾插法一样,此处错误就相当于r=r->next; r=p; 而
								   //尾插法的正确使用方法应该是先将尾节点与新节点之间地址关系连接起来,再移动尾指针,r->next=p,
								   //r=p; 上面的错误就是直接移动了指针,导致结点之间没有地址关系,地址关系就相当于箭头
//				if(temp==NULL){
//					temp=node;
//					return;
//				}
				if(temp->left==NULL){
					temp->left=node;
					return ;
				}
				else{
					temp=temp->left;
				}
			}else{
//				temp=temp->right;
//				if(temp==NULL){
//					temp=node;
//					return;
//				}
				if(temp->right==NULL){
					temp->right=node;
					return ;
				}
				else{
					temp=temp->right;
				}
			}
		}
	}
}
void inOrder(Node* node){
	if(node!=NULL)
	{
		inOrder(node->left);
		printf("%d\n",node->data);
		inOrder(node->right);
	}
}
//返回树的高度 当要比较树n结点的高度,首先要知道n-1个结点的高度,并比较左右子树的高度递归的返回条件是当树为空时返回0
int findH(Node *node){
	if(node==NULL)
		return 0;
	int leftH=findH(node->left );
	int rightH= findH(node->right);
	return max(leftH,rightH)+1;
}
//求树的最大结点  当要比较树n的最大结点时,首先要知道n-1个结点的最大结点     
//然后比较左右结点与根节点的大小,递归的返回条件是当不存在结点时返回无穷小    
int maxNode(Node* node){
	if(node==NULL)
		return INT_MIN;//返回无穷小
	int leftMax=maxNode(node->left);
	int rightMax=maxNode(node->right);
	int root	=node->data;
	int maxnode=leftMax;
	if(maxnode<rightMax) maxnode=rightMax;
	if(maxnode<root) 	 maxnode=root;
	return maxnode;
}
int main(){
	Tree T;
	T.root=NULL;
	int arr[9]={-3,8,7,6,5,4,3,-2,1};
	for(int i=0;i<9;i++){
		findBinaryTree(&T,arr[i]);
	}
	inOrder(T.root); //T.root就是指针 线索二叉树 中序遍历会直接输出从小到大的顺序
	cout<<findH(T.root)<<endl;
	cout<<maxNode(T.root)<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值