데이터 구조 절 대 진 할머니 판 제4 장

19413 단어 데이터 구조
글 목록
  • 이 진 트 리 검색
  • 이 진 트 리 가 무엇 입 니까 (Binary Search Tree, BST)
  • 이 진 트 리 검색 동작: Find
  • 최대 와 최소 요 소 를 찾 습 니 다
  • 이 진 트 리 삽입
  • 이 진 트 리 삭제
  • 밸 런 스 이 진 트 리
  • 밸 런 스 이 진 트 리 가 무엇 입 니까
  • 균형 이 진 트 리 의 조정
  • 특집: 같은 이 진 트 리 인지 아 닌 지 판별
  • 검색 트 리 의 표시
  • 수색 나 무 를 어떻게 만 듭 니까
  • 검색 트 리 의 표시
  • 수색 나 무 를 어떻게 만 듭 니까
  • 두 갈래 검색 트 리
    질문 찾기:
  • 정적 검색 과 동적 검색
  • 동적 검색, 데 이 터 를 어떻게 구성 하 는 지
  • 이 진 트 리 란 무엇 인가 (Binary Search Tree, BST)
    이 진 트 리
    이 진 트 리 가 비어 있 지 않 을 때 성질:
  • 비 어 있 는 왼쪽 트 리 이기 때문에 키 는 루트 노드 의 키 보다 작 습 니 다
  • 비 어 있 는 오른쪽 트 리 의 모든 키 값 은 뿌리 노드 의 키 값
  • 보다 큽 니 다.
  • 왼쪽, 오른쪽 나 무 는 모두 이 진 트 리
  • typedef struct TreeNode *BinTree;//    
    typedef BinTree Position;//        Position
    struct TreeNode{
    	ElementType Data;
    	BinTree Left;
    	BinTree Right;
    }
    

    두 갈래 검색 트 리 찾기 동작: Find
    사고의 방향
  • 뿌리 결산 점 에서 시작 하여 나무 가 비어 있 으 면 NULL
  • 을 되 돌려 줍 니 다.
  • 트 리 가 비어 있 지 않 으 면 루트 노드 키워드 와 X 를 비교 하고 서로 다른 처 리 를 합 니 다.
  • X 가 루트 노드 키 보다 작 으 면 왼쪽 트 리 에서 계속 검색 해 야 합 니 다
  • X 가 뿌리 노드 의 키 보다 크 면 오른쪽 트 리 에서 계속 검색
  • 이들 의 비교 결과 가 같 으 면 검색 이 완료 된다.이 노드 를 가리 키 는 지침 되 돌리 기
  • Position Find(ElementType X, BinTree BST)
    {
    	if(!BST)
    		return NULL;//    
    	if(X > BTS->Data)
        	return Find(X, BTS->Right);//       ,   
        Else if(X < BTS->Data)
        	return Find(X, BTS->Left);//       
        else//X == BTS->Data
        	return BST;//    ,         
    }
    

    비 귀속 함수 의 집행 효율 이 더욱 높 아 '꼬리 귀속' 함 수 를 순환 함수 로 바 꿀 수 있다
    Position IterFind(ElementType X, BinTree BST)
    {
    	while(BST){
    		if(X > BST->Right);
    			BST = BST->Right;//       ,    
    		else if(X < BST->Data)
    			BST = BST->Left;//       ,    
    		else 
    			return BST;//    ,       
    	}
    	return NULL;//    
    			
    }
    

    최대 와 최소 요 소 를 찾 습 니 다.
  • 최대 요 소 는 나무의 가장 오른쪽 가지 끝 점 에 있 습 니 다
  • 최소 요 소 는 나무의 가장 왼쪽 가지 끝 에 있 습 니 다
  • Position FindMin(BinTree BST)
    {
    	if(!BST)
    		return NULL;//     ,  NULL
    	else if(!BST->)
    		return BST;//         
    	else
    		return FindMin(BST->Left);//         
    }
    
    //           
    Position FinMax(BinTree BST)
    {
    	if(!BST)
    		return NULL;
    	else if(!BST->Right)
    		return BST;
    	else
    		return FinMax(BST->Right);
    }
    
    //           
    Position FindMax(BinTree BST)
    {
    	if(BST)
    		while(BST->Right)
    			BST = BST->Right;//       ,        
    	return BST;
    }
    

    두 갈래 검색 트 리 삽입
    사고: 요소 가 삽입 해 야 할 위 치 를 찾 습 니 다.Find 와 유사 한 방법 을 사용 할 수 있 습 니 다.
    BinTree Insert(ElementType X, BinTree BST)
    {
    	if(!BST)//     ,               
    	{
    		BST = malloc(sizeof(struct TreeNode));//    
    		BST->Data = X;//      X
    		BST-Left = BST->Right = NULL;//       NULL
    	}
    	else
    		if(X < BST->Data)
    			BST->Left = Insert(X, BST->Left);
    		else if(X > BST->Data)
    			BST->Right = Insert(X, BST->Right);
    	
    	return BST;
    }
    

    두 갈래 검색 트 리 삭제
    세 가지 상황:
  • 삭제 할 결점 은 엽 결점
  • 삭제 할 결점 은 키 트 리 하나
  • 삭제 할 노드 는 두 개의 하위 트 리 가 있 습 니 다.
  • 오른쪽 트 리 의 최소 값 대체
  • 왼쪽 트 리 중 최대 치 를 찾 아 대체 하기
  • //
    BinTree Delete(ElementType X, BinTree BST)
    {
        Position tmp;
        if(!BST)
            printf("not find");
        else if(X < BST->Data)
            BST->Left = Delete(X, BST->Left);//       
        else if(X > BST->Data)
            BST->Right = Delete(X, BST->Right);//       
        else//        
        {
            if(BST->Left && BST->Right)//              
            {
    			tmp = FindMin(BST->Right);//                   
                BST->Data = tmp->Data;
                BST->Right = Delete(BST->Data, BST->Right);//          
            }
            else{//                
                tmp = BST;
                if(!BST->Left)//          
                    BST = BST->Right;
                else if(!BST->Right)
                    BST = BST->Left;
                free(tmp);
            }
           
        }
        return BST;
    }
    

    밸 런 스 이 진 트 리
    밸 런 스 이 진 트 리 가 뭐야?
    노드 가 다른 삽입 순 서 는 서로 다른 깊이 와 서로 다른 검색 효율 및 평균 검색 길이 ASL 을 가 져 옵 니 다.
    평형 인자 (Balance Factor BF): BF (T) = hL - h_R, 그 중 hL,h_R 은 각각 T 의 좌우 자목 높이 다.
    밸 런 스 이 진 트 리 (밸 런 스 이 진 트 리):
    빈 트 리, 또는 임의의 노드 좌우 하위 트 리 높이 차 의 절대 치 는 1 을 초과 하지 않 습 니 다. 즉, * * | BF (T) | < = 1 * * *
    균형 이 잡 힌 이 진 트 리 의 높이
    피 보 나치 수열:
    밸 런 스 이 진 트 리 조정
    RR 회전
    LL 회전
    LR 회전
    RL 회전
    특집: 같은 두 갈래 검색 트 리 인지 아 닌 지 판별
  • 각각 두 그루 의 검색 나 무 를 만 드 는 판별 방법
  • 나 무 를 세우 지 않 는 판별 방법
  • 나 무 를 한 그루 만 들 고 다른 서열 이 이 나무 와 일치 하 는 지 판단 한다
  • 검색 트 리 표시
    typedef struct TreeNode *Tree;
    struct TreeNode{
    	int v;//         
    	Tree Left, Right;
    	int flag;//           ;     0;    1
    };
    

    검색 트 리 만 들 기
    같은 두 갈래 검색 트 리 가 아 닙 니 다.
  • 각각 두 그루 의 검색 나 무 를 만 드 는 판별 방법
  • 나 무 를 세우 지 않 는 판별 방법
  • 나 무 를 한 그루 만 들 고 다른 서열 이 이 나무 와 일치 하 는 지 판단 한다
  • 검색 트 리 표시
    typedef struct TreeNode *Tree;
    struct TreeNode{
    	int v;//         
    	Tree Left, Right;
    	int flag;//           ;     0;    1
    };
    

    검색 트 리 만 들 기

    좋은 웹페이지 즐겨찾기