java 中二叉搜索树的层序遍历
Level order traversal in a binary search tree in java
我为我的二叉搜索树做了 4 次不同的遍历。我被困在最后一个级别顺序遍历上,我似乎无法找到正确的方法。
主要问题是我不知道如何一次只搜索一层,我只能弄清楚如何搜索整个左子树或整个右子树。
private void preOrder(BinaryNode<AnyType> t )
{
if(isEmpty()){
System.out.println("Empty");
}
if(t != null) {
System.out.println(t.element);
preOrder(t.left);
preOrder(t.right);
}
}
private void postOrder(BinaryNode<AnyType> t){
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
postOrder(t.left);
postOrder(t.right);
System.out.println(t.element);
}
}
private void inOrder(BinaryNode<AnyType> t)
{
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
inOrder(t.left);
System.out.println(t.element);
inOrder(t.right);
}
}
private void levelOrder(BinaryNode<AnyType> t, int level)
{
if(isEmpty()){
System.out.println("Empty");
}
if(height(t) == 2) {
System.out.println(t.element);
}else if(height(t) > 1){
levelOrder(t.left, level );
levelOrder(t.right, level );
}
}
您的方法看起来像 DFS 方法 它可能不遵循该方法。
在这里尝试使用 Queue 它会帮助你正确遍历。
因为它将遵循 BFS 方法,因此您可以逐层遍历。
添加第一个左节点,然后添加右节点,然后按照以下顺序添加。
将整个搜索视为一系列 "rounds",每个级别一个 "round"。
每一轮:
- initialize a "next round" list of nodes to empty
- process a prepared list of nodes (the ones that are at that level and thus to be searched in that round) whereby for each node :
- do the actual comparison
- add all the node's child nodes to the "next round" list
使用只填充了根节点的 "next round" 列表启动进程。
重复直到 "next round" 个节点列表为空或者您找到了您要查找的内容。
我就是这样做的。
private void levelOrder(BinaryNode root) {
if (root == null) {
return;
}
Queue<BinaryNode> q = new LinkedList<>();
// Pushing root node into the queue.
q.add(root);
// Executing loop till queue becomes
// empty
while (!q.isEmpty()) {
BinaryNode curr = q.poll();
System.out.print(curr.element + " ");
// Pushing left child current node
if (curr.left != null) {
q.add(curr.left);
}
// Pushing right child current node
if (curr.right != null) {
q.add(curr.right);
}
}
}
我为我的二叉搜索树做了 4 次不同的遍历。我被困在最后一个级别顺序遍历上,我似乎无法找到正确的方法。
主要问题是我不知道如何一次只搜索一层,我只能弄清楚如何搜索整个左子树或整个右子树。
private void preOrder(BinaryNode<AnyType> t )
{
if(isEmpty()){
System.out.println("Empty");
}
if(t != null) {
System.out.println(t.element);
preOrder(t.left);
preOrder(t.right);
}
}
private void postOrder(BinaryNode<AnyType> t){
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
postOrder(t.left);
postOrder(t.right);
System.out.println(t.element);
}
}
private void inOrder(BinaryNode<AnyType> t)
{
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
inOrder(t.left);
System.out.println(t.element);
inOrder(t.right);
}
}
private void levelOrder(BinaryNode<AnyType> t, int level)
{
if(isEmpty()){
System.out.println("Empty");
}
if(height(t) == 2) {
System.out.println(t.element);
}else if(height(t) > 1){
levelOrder(t.left, level );
levelOrder(t.right, level );
}
}
您的方法看起来像 DFS 方法 它可能不遵循该方法。 在这里尝试使用 Queue 它会帮助你正确遍历。 因为它将遵循 BFS 方法,因此您可以逐层遍历。 添加第一个左节点,然后添加右节点,然后按照以下顺序添加。
将整个搜索视为一系列 "rounds",每个级别一个 "round"。
每一轮:
- initialize a "next round" list of nodes to empty
- process a prepared list of nodes (the ones that are at that level and thus to be searched in that round) whereby for each node :
- do the actual comparison
- add all the node's child nodes to the "next round" list
使用只填充了根节点的 "next round" 列表启动进程。
重复直到 "next round" 个节点列表为空或者您找到了您要查找的内容。
我就是这样做的。
private void levelOrder(BinaryNode root) {
if (root == null) {
return;
}
Queue<BinaryNode> q = new LinkedList<>();
// Pushing root node into the queue.
q.add(root);
// Executing loop till queue becomes
// empty
while (!q.isEmpty()) {
BinaryNode curr = q.poll();
System.out.print(curr.element + " ");
// Pushing left child current node
if (curr.left != null) {
q.add(curr.left);
}
// Pushing right child current node
if (curr.right != null) {
q.add(curr.right);
}
}
}