#ifndef
__TREE_H__
#define
__TREE_H__
#include
<vector>
enum
{
DirLeft
= 0,
DirRight
= 1, };
struct
node
{
int
nNodeData
;
node
*
pLeftNode
;
node
*
pRightNode
;
};
class
CTree
{
public
:
CTree
() {}
~
CTree
() {}
void
Initialize
();
bool
InsertNode
(
int
nValue
);
void
InOrderRecursion
();
//
递归中根遍历
void
InOrderRecusionHelp
(
node
*
pNode
);
void
PreOrderRecursion
();
//
递归前根遍历
void
PreOrderRecursionHelp
(
node
*
pNode
);
void
PostOrderRecursion
();
//
递归后根遍历
void
PostOrderRecursionHelp
(
node
*
pNode
);
void
InOrderNoRecursion
();
//
非递归中根遍历
void
PreOrderRecursionWay1
();
//
非递归前跟遍历方式
void
PreOrderRecursionWay2
();
//
非递归前跟遍历方式
void
PostOrderNoRecursion1
();
//
非递归后跟遍历方式
void
PostOrderNoRecursion2
();
//
非递归后跟遍历方式
//
层次遍历
void
LevelTravase
();
void
PrintTree
();
private
:
node
*
m_pRoot
;
std
::
vector
<
int
>
m_vecInOrderRecur
;
std
::
vector
<
int
>
m_vecInOrderNoRecur
;
std
::
vector
<
int
>
m_vecPreOrderRecur
;
std
::
vector
<
int
>
m_vecPreOrderNoRecur1
;
std
::
vector
<
int
>
m_vecPreOrderNoRecur2
;
std
::
vector
<
int
>
m_vecPostOrderRecur
;
std
::
vector
<
int
>
m_vecPostOrderNoRecur
;
std
::
vector
<
int
>
m_vecPostOrderNoRecur2
;
std
::
vector
<
int
>
m_vecLevelTravse
;
};
#endif // _TREE_H_
// TravseTree.cpp : Defines the entry point for the console application.
//
#include
"stdafx.h"
#include
"Tree.h"
#include
<iostream>
#include
<list>
void
CTree
::
Initialize
()
{
m_pRoot
=
NULL
;
}
bool
CTree
::
InsertNode
(
int
nValue
)
{
node
*
pNewNode
=
new
node
;
if
( !
pNewNode
)
{
return
false
;
}
pNewNode
->
nNodeData
=
nValue
;
pNewNode
->
pLeftNode
=
NULL
;
pNewNode
->
pRightNode
=
NULL
;
if
(
m_pRoot
==
NULL
)
{
m_pRoot
=
pNewNode
;
return
true
;
}
int
nDir
= -1;
node
*
pFindPlace
=
m_pRoot
;
while
( 1 )
{
if
(
nValue
> (
pFindPlace
->
nNodeData
) )
{
if
(
pFindPlace
->
pRightNode
)
pFindPlace
=
pFindPlace
->
pRightNode
;
else
{
nDir
=
DirRight
;
break
;
}
}
else
{
if
(
pFindPlace
->
pLeftNode
)
pFindPlace
=
pFindPlace
->
pLeftNode
;
else
{
nDir
=
DirLeft
;
break
;
}
}
}
if
(
DirLeft
==
nDir
)
pFindPlace
->
pLeftNode
=
pNewNode
;
else
pFindPlace
->
pRightNode
=
pNewNode
;
return
true
;
}
void
CTree
::
InOrderRecursion
()
{
m_vecInOrderRecur
.
clear
();
InOrderRecusionHelp
(
m_pRoot
);
}
void
CTree
::
InOrderRecusionHelp
(
node
*
pNode
)
{
if
( !
pNode
)
return
;
InOrderRecusionHelp
(
pNode
->
pLeftNode
);
m_vecInOrderRecur
.
push_back
(
pNode
->
nNodeData
);
InOrderRecusionHelp
(
pNode
->
pRightNode
);
}
void
CTree
::
InOrderNoRecursion
()
{
node
*
pNode
=
m_pRoot
;
std
::
vector
<
node
*>
listNodeSet
;
listNodeSet
.
clear
();
m_vecInOrderNoRecur
.
clear
();
do
{
while
(
pNode
)
{
listNodeSet
.
push_back
(
pNode
);
pNode
=
pNode
->
pLeftNode
;
}
pNode
=
listNodeSet
.
back
();
m_vecInOrderNoRecur
.
push_back
(
pNode
->
nNodeData
);
listNodeSet
.
pop_back
();
pNode
=
pNode
->
pRightNode
;
}
while
(
pNode
|| !
listNodeSet
.
empty
() );
}
void
CTree
::
PreOrderRecursion
()
{
m_vecPreOrderRecur
.
clear
();
PreOrderRecursionHelp
(
m_pRoot
);
}
void
CTree
::
PreOrderRecursionHelp
(
node
*
pNode
)
{
if
( !
pNode
)
return
;
m_vecPreOrderRecur
.
push_back
(
pNode
->
nNodeData
);
PreOrderRecursionHelp
(
pNode
->
pLeftNode
);
PreOrderRecursionHelp
(
pNode
->
pRightNode
);
}
void
CTree
::
PreOrderRecursionWay1
()
{
m_vecPreOrderNoRecur1
.
clear
();
std
::
vector
<
node
*>
vecNodeSet
;
vecNodeSet
.
clear
();
vecNodeSet
.
push_back
(
m_pRoot
);
node
*
pTempNode
;
while
( !
vecNodeSet
.
empty
() )
{
pTempNode
=
vecNodeSet
.
back
();
vecNodeSet
.
pop_back
();
m_vecPreOrderNoRecur1
.
push_back
(
pTempNode
->
nNodeData
);
if
(
pTempNode
->
pRightNode
)
vecNodeSet
.
push_back
(
pTempNode
->
pRightNode
);
if
(
pTempNode
->
pLeftNode
)
vecNodeSet
.
push_back
(
pTempNode
->
pLeftNode
);
}
}
void
CTree
::
PreOrderRecursionWay2
()
{
m_vecPreOrderNoRecur2
.
clear
();
std
::
vector
<
node
*>
vecNodeStack
;
vecNodeStack
.
clear
();
node
*
TempNode
=
m_pRoot
;
do
{
while
(
TempNode
)
{
m_vecPreOrderNoRecur2
.
push_back
(
TempNode
->
nNodeData
);
vecNodeStack
.
push_back
(
TempNode
);
TempNode
=
TempNode
->
pLeftNode
;
}
TempNode
=
vecNodeStack
.
back
();
vecNodeStack
.
pop_back
();
TempNode
=
TempNode
->
pRightNode
;
}
while
( !(
NULL
==
TempNode
&&
vecNodeStack
.
empty
() ) );
}
void
CTree
::
PostOrderRecursion
()
{
m_vecPostOrderRecur
.
clear
();
PostOrderRecursionHelp
(
m_pRoot
);
}
void
CTree
::
PostOrderRecursionHelp
(
node
*
pNode
)
{
if
( !
pNode
)
return
;
PostOrderRecursionHelp
(
pNode
->
pLeftNode
);
PostOrderRecursionHelp
(
pNode
->
pRightNode
);
m_vecPostOrderRecur
.
push_back
(
pNode
->
nNodeData
);
}
void
CTree
::
PostOrderNoRecursion1
()
{
m_vecPostOrderNoRecur
.
clear
();
std
::
vector
<
node
*>
vecNodeSet
;
vecNodeSet
.
clear
();
vecNodeSet
.
push_back
(
m_pRoot
);
while
( !
vecNodeSet
.
empty
() )
{
node
*
p
=
vecNodeSet
.
back
();
vecNodeSet
.
pop_back
();
m_vecPostOrderNoRecur
.
push_back
(
p
->
nNodeData
);
if
(
p
->
pLeftNode
)
vecNodeSet
.
push_back
(
p
->
pLeftNode
);
if
(
p
->
pRightNode
)
vecNodeSet
.
push_back
(
p
->
pRightNode
);
}
int
nSize
=
m_vecPostOrderNoRecur
.
size
();
--
nSize
;
int
nTempData
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
, --
nSize
)
{
nTempData
=
m_vecPostOrderNoRecur
[
i
];
m_vecPostOrderNoRecur
[
i
] =
m_vecPostOrderNoRecur
[
nSize
];
m_vecPostOrderNoRecur
[
nSize
] =
nTempData
;
}
}
void
CTree
::
PostOrderNoRecursion2
()
{
m_vecPostOrderNoRecur2
.
clear
();
std
::
vector
<
node
*>
vecNodeStack
;
vecNodeStack
.
clear
();
node
*
TempNode
=
m_pRoot
;
do
{
while
(
TempNode
)
{
m_vecPostOrderNoRecur2
.
push_back
(
TempNode
->
nNodeData
);
vecNodeStack
.
push_back
(
TempNode
);
TempNode
=
TempNode
->
pRightNode
;
}
TempNode
=
vecNodeStack
.
back
();
vecNodeStack
.
pop_back
();
TempNode
=
TempNode
->
pLeftNode
;
}
while
( !(
NULL
==
TempNode
&&
vecNodeStack
.
empty
() ) );
}
void
CTree
::
LevelTravase
()
{
m_vecLevelTravse
.
clear
();
std
::
list
<
node
*>
listNodeQueue
;
listNodeQueue
.
clear
();
listNodeQueue
.
push_back
(
m_pRoot
);
while
( !
listNodeQueue
.
empty
() )
{
node
*
pFindNode
=
listNodeQueue
.
front
();
listNodeQueue
.
pop_front
();
m_vecLevelTravse
.
push_back
(
pFindNode
->
nNodeData
);
if
(
pFindNode
->
pLeftNode
)
listNodeQueue
.
push_back
(
pFindNode
->
pLeftNode
);
if
(
pFindNode
->
pRightNode
)
listNodeQueue
.
push_back
(
pFindNode
->
pRightNode
);
}
}
void
CTree
::
PrintTree
()
{
int
nSize
=
m_vecInOrderRecur
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
中序遍历
----
递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecInOrderRecur
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecInOrderNoRecur
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
中序遍历
----
非递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecInOrderNoRecur
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPreOrderRecur
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
前序遍历
----
递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecPreOrderRecur
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPreOrderNoRecur1
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
前序遍历
----
非递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecPreOrderNoRecur1
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPreOrderNoRecur2
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
前序遍历
----
非递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecPreOrderNoRecur2
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPostOrderRecur
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
后序遍历
----
递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecPostOrderRecur
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPostOrderNoRecur
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
后序遍历
----
非递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecPostOrderNoRecur
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecPostOrderNoRecur2
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
后序遍历
----
非递归
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
=
nSize
- 1;
i
>= 0; --
i
)
std
::
cout
<<
" "
<<
m_vecPostOrderNoRecur2
[
i
]<<
" "
<<
std
::
endl
;
}
nSize
=
m_vecLevelTravse
.
size
();
if
(
nSize
!= 0 )
{
std
::
cout
<<
"
层次遍历
------------"
<<
std
::
endl
<<
std
::
endl
;
for
(
int
i
= 0;
i
<
nSize
; ++
i
)
std
::
cout
<<
" "
<<
m_vecLevelTravse
[
i
]<<
" "
<<
std
::
endl
;
}
}
#include
"stdafx.h"
#include
"Tree.h"
const
static
int
A
[8] = { 14, 5, 10, 23, 6, 90, 2, 31 };
int
main
()
{
CTree
tree
;
tree
.
Initialize
();
for
(
int
i
= 0;
i
< 8; ++
i
)
tree
.
InsertNode
(
A
[
i
] );
tree
.
InOrderRecursion
();
tree
.
InOrderNoRecursion
();
tree
.
PreOrderRecursion
();
tree
.
PreOrderRecursionWay1
();
tree
.
PreOrderRecursionWay2
();
tree
.
PostOrderRecursion
();
tree
.
PostOrderNoRecursion1
();
tree
.
PostOrderNoRecursion2
();
tree
.
LevelTravase
();
tree
.
PrintTree
();
system
(
"pause"
);
return
0;
}