#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;
}