이 진 트 리 를 옮 겨 다 니 며 - 재 귀적 실현
다음은 일부 면접 문제 코드 의 재 귀적 실현 이다.비 귀속 실현 은 다음 블 로그 에 발 표 될 것 이다.
"BinaryTree.h"
<strong><span style="font-size:18px;">#pragma once
template<class T>
class BinaryTreeNode
{
public:
T _data;
BinaryTreeNode<T>* _left;
BinaryTreeNode<T>* _right;
BinaryTreeNode(const T& data)
:_data(data)
,_left(NULL)
,_right(NULL)
{}
};
template<class T>
class BinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
BinaryTree()
:_root(NULL)
{}
BinaryTree(const T* a,size_t size,const T& invalid)//invalid
{
size_t inder = 0;
_root = _GreateTree(a,size,invalid,inder);
}
void PrevOrder()//
{
_PrevOrder(_root);
cout<<endl;
}
void InOrder()//
{
_InOrder(_root);
cout<<endl;
}
void PostOrder()//
{
_PostOrder(_root);
cout<<endl;
}
size_t Size()//
{
return _Size(_root);
}
size_t LeafSize()//
{
return _LeafSize(_root);
}
size_t Depth()//
{
return _Depth(_root);
}
size_t GetKLevel(size_t k)// k
{
return _GetKLevel(_root,k);
}
Node* Find(const T& data)//
{
return _Find(_root,data);
}
protected:
Node* _Find(Node* root,const T& data)
{
if (root == NULL)
{
return NULL;
}
if (root->_data == data)
{
return root;
}
//
Node* ret = _Find(root->_left,data);
if (ret)
{
return ret;
}
//
return _Find(root->_right,data);
}
size_t _GetKLevel(Node* root,size_t k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return _GetKLevel(root->_left,k-1) + _GetKLevel(root->_right,k-1);// k-1 k--,
}
size_t _Depth(Node* root)
{
if (root == NULL)
{
return 0;
}
return _Depth(root->_left) > _Depth(root->_right) ? _Depth(root->_left)+1 : _Depth(root->_right)+1;//
}
size_t _LeafSize(Node* root)
{
if (root == NULL)
{
return 0;
}
if (root->_left == NULL && root->_right == NULL)
{
return 1;
}
return _LeafSize(root->_left)+_LeafSize(root->_right);
}
size_t _Size(Node* root)
{
if (root == NULL)
{
return 0;
}
return _Size(root->_left)+_Size(root->_right)+1;
}
void _PostOrder(Node* root)
{
if (root == NULL)
{
return;
}
_PostOrder(root->_left);
_PostOrder(root->_right);
cout<<root->_data<<" ";
}
void _InOrder(Node* root)
{
if (root == NULL)
{
return;
}
_InOrder(root->_left);
cout<<root->_data<<" ";
_InOrder(root->_right);
}
void _PrevOrder(Node* root)
{
if (root == NULL)
{
return;
}
cout<<root->_data<<" ";
_PrevOrder(root->_left);
_PrevOrder(root->_right);
}
Node* _GreateTree(const T* a,size_t size,const T& invalid,size_t& inder)// inder ,
{
Node* root = NULL;
if (a[inder] != invalid && inder < size)
{
root = new Node(a[inder]);
root->_left = _GreateTree(a,size,invalid,++inder);
root->_right = _GreateTree(a,size,invalid,++inder);
}
return root;//
}
private:
Node* _root;
};
</span></strong>
"test.cpp"
<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include "BinaryTree.h"
void TestBinaryTree()
{
int arr[] = {1, 2, 3, '#', '#', 4, '#' , '#', 5, 6};
int size = sizeof(arr)/sizeof(arr[0]);
BinaryTree<int> T(arr,size,'#');
cout<<" : ";
T.PrevOrder();
cout<<" : ";
T.InOrder();
cout<<" : ";
T.PostOrder();
cout<<" ? "<<T.Size()<<endl;
cout<<" ? "<<T.LeafSize()<<endl;
cout<<" ? "<<T.Depth()<<endl;
cout<<" k :"<<endl;
int k = 0;
cin>>k;
cout<<" k ? "<<T.GetKLevel(k)<<endl;
typedef BinaryTreeNode<int> Node;
Node* ret = T.Find(2);
if (ret == NULL)
{
cout<<" "<<endl;
}
else
{
cout<<ret->_data<<" ";
cout<<" "<<endl;
}
}
int main()
{
TestBinaryTree();
system("pause");
return 0;
}</span></strong>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.